2011-03-31 3 views
0

저는 데이터베이스에서 데이터를 가져 와서이 데이터로 일부 통계를 생성하는 웹 사이트를 만들려고합니다.전체 달 날짜를 얻는 가장 좋은 방법은 무엇입니까?

사용자가 한 달을 선택한 다음 해당 달의 데이터 만 쿼리 할 수 ​​있도록하는 것이 아이디어입니다. 따라서 사용자가 1 월을 선택하면 데이터> 01/01/2011 및 < 31/01/2011을 쿼리합니다.

달에서 시작 데이터를 생성 한 다음 1 개월을 더하고 하루를 빼서 주어진 월의 마지막 날을 얻는 방법에 대해 생각했지만 그 방법이 가장 좋지 않다고 생각하지 않습니다. 주어진 달로부터 전체 날짜를 생성합니다.

아이디어가 있으십니까?

+0

왜 이것이 최선의 방법이라고 생각하지 않습니까? 매우 간단한 날짜 작업에 문제가 있습니까? –

+0

@Stofke SQL은 무엇을 위해 설계 되었습니까? 날짜 계산을 위해서? 그는 날짜를 얻는 방법을 묻는 것이지 그것을 비교하는 방법이 아닙니다. –

+0

@Stofke 그는 쿼리하는 방법이 아니라 범위를 얻는 방법을 묻습니다. –

답변

4

SQL 중심의 방법 :

SELECT * FROM `foo` WHERE MONTH(`date`) = 3 AND YEAR(`date`) = 2011 

대체 선택에서 월과 연도 번호.

PHP 중심 방법 :

$month = 3; 
$year  = 2011; 
$firstDay = "$year-$month-1"; 
$lastDay = "$year-$month-" . date('t', strtotime($firstDay)); 

$query = "SELECT * FROM `foo` 
      WHERE `date` >= '$firstDay' 
      AND `date` <= '$lastDay'"; 
+0

네, 저의 SQL보다 훨씬 좋은 솔루션 – Stofke

+0

굉장합니다! 나는 그 문장을 알지 못했고, 시도해 보았고 매우 잘 작동했다. :) –

+0

MySQL은 당신이 MONTH와 YEAR 같은 것을 검색 할 때 인덱스를 사용할 수 있습니까? 아니면 테이블 스캔에 의존할까요? – cHao

0

당신이 DateTimeStamp로 데이터를 저장하는 경우, 단순히 특정 연도의 특정 달에서 결과를 반환 쿼리에 조건을 추가 할 수 있습니다. 이를 위해 LIKE 절을 사용할 수 있습니다. 지난 달

1

레코드 선택 :

select `id` 
from `orders` 
where `created_at` > LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) 
    AND `created_at` < DATE_ADD(LAST_DAY(CURDATE()), INTERVAL 1 DAY) 

이전 달 :

select `id` 
from `orders` 
where `created_at` > LAST_DAY(DATE_SUB(CURDATE(), INTERVAL 2 MONTH)) 
    AND `created_at` < DATE_ADD(LAST_DAY(CURDATE() - INTERVAL 1 MONTH), INTERVAL 1 DAY) 

+0

그건 정확히 내가 피하려고했던 것입니다. –

+0

@Antonio는 상당히 반대합니다. 그것은 실제로 당신이 찾고 있었던 것입니다. 'CURDATE()'를 원하는 달을 나타내는'2010-03-01' 형식으로 대체하고 나머지는 mysql로 ​​계산할 수 있습니다. 반면 select tiself는 가장 효율적인 방법으로 수행됩니다. –

1

여기 당신을위한 교훈이다.

대부분의 초보자 프로그래머는 "최고의", "가장 효율적인"방법 및 물건을 찾고 있습니다.
코드의 양으로 효율을 판단하고있는 중! "적은 코드 - 더 효율적입니다!" - 그들은 생각한다. 물론 잘못된 것입니다. 의는 "비효율적"한 개 "효율적"솔루션을 비교 해보자

mysql> explain select * from Board where year(date) = 2011 and month(date) = 1; 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | Board | ALL | NULL   | NULL | NULL | NULL | 18113 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 

mysql> explain select * from Board where date > '2010-12-31' and date < '2011-02-01'; 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE  | Board | range | date   | date | 9  | NULL | 325 | Using where | 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 

공지 사항 possible keysrows 매개 변수를 설정합니다.

후자의 경우 데이터베이스는 필요한 정확한 행을 얻습니다. 전자에서는 테이블의 모든 행을 선택하고 날짜에 함수를 적용하고 상수와 비교합니다.

같은 당신의 무지 코멘트 후 자신의 좋은 답변을 삭제 가난한 사람의 솔루션을 간다 :

mysql> explain select * from Board where `date` > LAST_DAY(DATE_SUB('2011-01-15', INTERVAL 1 MONTH)) AND `date` < DATE_ADD(LAST_DAY('2011-01-15'), INTERVAL 1 DAY); 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE  | Board | range | date   | date | 9  | NULL | 325 | Using where | 
+----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 

안 그런가 말했다.

+0

수업은 훌륭하지만 나쁜 매너는 정말 짜증납니다. 제발, 다음에 좀 더 예의 바르게 굴어주세요. 나는 멍청하고, 프로그래밍에 정말로 멍청하다. 그러나 나는 단지 배우기를 원한다. 지식으로 태어난 사람은 아무도 없습니다. –

+0

@Antonio 내 대답에 무언가 너무 무례한 이유는 무엇 때문에 학대를 느끼게 만들었습니까? –

+0

문화적 차이에 대해 뭔가있을 수 있습니다, 당신이 정말로 당신의 의견이 무례하지 않았다고 생각한다면 나는 모르고 미안합니다. 스페인에서는 누군가를 무식하다고 부르는 것은 다소 무례한 일입니다.하지만 제게 많은 도움이 되었기 때문에 귀하의 의견에 진심으로 감사 드리며, 다음 번에는 쿼리 성능을 직접 확인할 수 있습니다. –

관련 문제