[php] 월 및 연도 기준으로 만 mySQL 선택

mySQL DB에 일부 행이있는 열이 있습니다. 이 행 중 하나는 다음과 같이 DATE입니다.2012-02-01

내가 달성하고 싶은 것은 연도와 월만을 기준으로 PHP로 SELECT를 수행하는 것입니다.

SELECT의 논리는 다음과 같습니다.

$q="SELECT * FROM projects WHERE Date="SELECT HERE THE SPECIFIC YEAR AND MONTH"";

특정 월과 연도는 다음 $_POST과 같이 변수 에서 전달됩니다.$_POST['period']="2012-02";

내가 어떻게 해?



답변

SELECT * FROM projects WHERE YEAR(Date) = 2011 AND MONTH(Date) = 5


답변

당신이 가지고 있다면

$_POST['period'] = "2012-02";

먼저 매월 1 일을 찾습니다.

$first_day = $_POST['period'] . "-01"

그러면이 쿼리는 인덱스를 사용합니다 Date.

$q = "
    SELECT *
    FROM projects
    WHERE Date BETWEEN '$first_day'
                   AND LAST_DAY( '$first_day' )
     " ;

꽤 잘 작동하는 포괄적-배타적 간격을 사용할 수도 있습니다 (열이 DATE, DATETIME또는 또는 TIMESTAMP정밀도에 대해 걱정할 필요가 없습니다 .

$q = "
    SELECT *
    FROM projects
    WHERE Date >= '$first_day'
      AND Date  < '$first_day' + INTERVAL 1 MONTH
     " ;

보안 경고:

이러한 값을 적절하게 이스케이프하거나 준비된 문을 사용해야합니다. 요컨대, SQL 주입 문제를 피하기 위해 요즘 PHP에서 권장되는 방법을 사용하십시오.


답변

여기 있습니다. 컴퓨팅을 PHP에 맡기고 DB에 작업을 저장하십시오. 이렇게하면 Date열에 대한 인덱스를 효과적으로 사용할 수 있습니다 .

<?php
    $date = $_POST['period'];

    $start = strtotime($date);
    $end   = strtotime($date . ' 1 month - 1 second');

    $query = sprintf(
        'SELECT *
           FROM projects
          WHERE Date BETWEEN FROM_UNIXTIME(%u) AND FROM_UNIXTIME(%u)',
        $start,
        $end
    );

편집
유닉스 타임 스탬프 변환을 잊어 버렸습니다.


답변

$q="SELECT * FROM projects WHERE YEAR(date) = 2012 AND MONTH(date) = 1;


답변

타임 스탬프에서 값을 가져 오는 데이터베이스 필드 created_at가 있다고 가정합니다. created_at 날짜부터 년 및 월별로 검색하려고합니다.

YEAR(date(created_at))=2019 AND MONTH(date(created_at))=2


답변

여기 mySQL에서 MONTH 및 DATE 별 레코드 찾기

다음은 POST 값입니다. $_POST['period']="2012-02";

그냥 대시로 가치를 폭발 시키세요 $Period = explode('-',$_POST['period']);

분해 값에서 배열 가져 오기 :

Array
(
[0] => 2012
[1] => 02
)

SQL 쿼리에 값 입력 :

SELECT * FROM projects WHERE YEAR(Date) = '".$Period[0]."' AND Month(Date) = '".$Period[0]."';

MONTH 및 YEAR별로 결과를 가져옵니다.


답변

날짜 열에서 월 및 연도 값을 얻으려면

select year(Date) as "year", month(Date) as "month" from Projects