source

Mysql: 두 날짜 사이의 모든 데이터 선택

ittop 2023. 7. 26. 22:26
반응형

Mysql: 두 날짜 사이의 모든 데이터 선택

날짜와 연결된 데이터가 있는 mysql 테이블을 가지고 있습니다.각 행에는 다음과 같은 데이터와 날짜가 있습니다.

2009-06-25    75
2009-07-01    100
2009-07-02    120

두 날짜 사이의 모든 데이터를 선택하는 mysql 쿼리가 있습니다.다음은 쿼리입니다.

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

문제는 하루 동안 데이터가 없더라도 date1과 date2 사이의 행도 받아야 한다는 것입니다.

그래서 제 질문은 2009-06-25와 2009-07-01 사이에 비어 있는 날짜를 놓치게 될 것입니다.

제가 이 날짜들을 단지 0으로 데이터로 추가할 수 있습니까?

흔히 '일정표'라고 하는 개념을 사용할 수 있습니다.MySql에서 일정표를 만드는 방법에 대한 좋은 가이드는 다음과 같습니다.

-- create some infrastructure
CREATE TABLE ints (i INTEGER);
INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

-- only works for 100 days, add more ints joins for more
SELECT cal.date, tbl.data
FROM (
    SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY as date
    FROM ints a JOIN ints b
    ORDER BY a.i * 10 + b.i
) cal LEFT JOIN tbl ON cal.date = tbl.date
WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01';

테이블을 생성할 수 있습니다.cal하위 선택 대신 선택합니다.

Select *  from  emp where joindate between date1 and date2;

그러나 이 쿼리는 올바른 데이터를 표시하지 않습니다.

에그

1-jan-2013 to 12-jan-2013.

하지만 쇼 데이터입니다.

1-jan-2013 to 11-jan-2013.

이 상황을 다루는 것은 매우 쉽습니다.

BETWE CLAUSE는 date_sub(지금( ), INTERVAL 30 DAY ) 및 NOW( )와 함께 사용할 수 있습니다.

SELECT
    sc_cust_design.design_id as id,
    sc_cust_design.main_image,
    FROM
    sc_cust_design
WHERE
    sc_cust_design.publish = 1 
    AND **`datein`BETWEEN date_sub( now( ) , INTERVAL 30 DAY ) AND NOW( )**

해피 코딩 :)

날짜가 모두 적혀 있는 테이블이 있습니까?그렇지 않은 경우 달력 테이블을 구현하고 데이터를 달력 테이블에 결합하는 것을 고려할 수 있습니다.

피할 수 있다면,하지 마세요.

데이터베이스는 실제로 이를 위해 설계된 것이 아니며, 쿼리 내에 데이터(날짜 목록)를 효과적으로 작성하려고 합니다.

DB 쿼리 위에 애플리케이션 계층이 있는 사용자라면 누구나 해당 계층에 빈 데이터를 입력하는 것이 가장 간단한 해결책입니다.

어쨌든 쿼리 결과를 반복할 가능성이 크므로 다음과 같은 기능을 구현할 수 있습니다.

loop_date = start_date

while (loop_date <= end_date){

  if(loop_date in db_data) {
    output db_data for loop_date
  }
  else {
    output default_data for loop_date
  }

  loop_date = loop_date + 1 day
}

데이터 전송 감소, 쿼리 디버그 간소화, 일정관리 테이블 오버플로우 걱정 없음 등의 이점이 있습니다.

다음을 사용하여 종료 날짜에 1일을 추가해야 합니다.DATE_ADD('$end_date', INTERVAL 1 DAY)

대체 솔루션으로 를 사용할 수 있습니다.

SELECT * FROM TABLE_NAME WHERE `date` >= '1-jan-2013' 
OR `date` <= '12-jan-2013'

언급URL : https://stackoverflow.com/questions/1080207/mysql-select-all-data-between-two-dates

반응형