How to look up the Date Interval
만약 아래와 같은 테이블이 있다고 가정하면,
TITLE | DATE_ST | DATE_ED |
CASE #1 | 2023-07-01 09:00:00.000 | 2023-07-02 10:10:10.000 |
CASE #2 | 2023-06-01 09:00:00.000 | 2023-07-02 10:10:10.000 |
CASE #3 | 2022-07-01 09:00:00.000 | 2023-07-02 10:10:10.000 |
CASE #1 : 시작 일자와 종료 일자가 1일 1시간 10분 10초 차이
CASE #2 : 시작 일자와 종료 일자가 1개월 1일 1시간 10분 10초 차이
CASE #3 : 시작 일자와 종료 일자가 1년 1일 1시간 10분 10초 차이
1. 테이블 생성
CREATE TABLE TESTDATE (
TITLE TEXT
, DATE_ST TEXT
, DATE_ED TEXT
)
SQLite에는 별도의 Date Type이 없으므로, 문자열 형태의 TEXT 또는 TIMESTAMP로 저장하기 위해 REAL을 이용해야 합니다.
2. 테스트 데이터 추가
INSERT INTO TESTDATE (TITLE, DATE_ST, DATE_ED) VALUES ('CASE #1', '2023-07-01 09:00:00.000', '2023-07-02 10:10:10.000')
INSERT INTO TESTDATE (TITLE, DATE_ST, DATE_ED) VALUES ('CASE #2', '2023-06-01 09:00:00.000', '2023-07-02 10:10:10.000')
INSERT INTO TESTDATE (TITLE, DATE_ST, DATE_ED) VALUES ('CASE #1', '2022-07-01 09:00:00.000', '2023-07-02 10:10:10.000')
위 Query를 실행하면 아래와 같이 테이블에 데이터가 입력 되었음을 확인 가능합니다.
3. 율리우스일 (JULIANDAY)
SQLite에서는 JULIANDAY 함수를 제공합니다. 때문에 각 날짜는 아래와 같이 Query를 수행하여 율리우스일로 변환 가능합니다.
SELECT JULIANDAY('NOW')
, JULIANDAY('2023-07-01 09:00:00.000')
4. DATEDIFF
SQLite에서는 DATE형이 없으니 날짜 계산을 위한 DATEDIFF나 시간 계산을 위한 TIMEDIFF가 없으니, 율리우스일 기준으로 날짜 간격을 구한 후 별도의 계산을 해주어야 합니다. 때문에, 정확한 연/월 까지는 단순 Query로는 어렵고, 일/시/분/초는 가능합니다.
SELECT TITLE
, DATE_ST
, DATE_ED
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) / 30 / 12 AS INTEGER) AS DIFF_YEAR
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) / 30 AS INTEGER) AS DIFF_MONTH
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) AS INTEGER) AS DIFF_DATE
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) * 24 AS INTEGER) AS DIFF_HOUR
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) * 24 * 60 AS INTEGER) AS DIFF_MINUTE
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) * 24 * 60 * 60 AS INTEGER) AS DIFF_SECOND
FROM TESTDATE
5. STRFTIME
날짜/시간을 문자열(String)으로 변환해주는 함수입니다.
SELECT JULIANDAY('NOW') AS TODAY
, JULIANDAY('2023-07-01 09:00:00.000') AS JULIAN
, STRFTIME('%Y%m', '2023-07-01 09:00:00.000') AS YYYYMM
, STRFTIME('%m', '2023-08-01 09:00:00.000') AS MM
만약 위의 3, 4번 줄과 같이 사용한다면, 각각 연월과 월을 반환하여
3번은 202307
4번은 08
을 반환하게 됩니다.
이를 활용하여, JULIANDAY에서 미흡했던 연/월에 대한 계산도 가능하게 됩니다.
SELECT TITLE
, DATE_ST
, DATE_ED
, CAST((STRFTIME('%Y', DATE_ED) - STRFTIME('%Y', DATE_ST)) AS INTEGER) AS DIFF_YEAR
, CAST((STRFTIME('%Y', DATE_ED) - STRFTIME('%Y', DATE_ST)) AS INTEGER) * 12
+ CAST((STRFTIME('%m', DATE_ED) - STRFTIME('%m', DATE_ST)) AS INTEGER) AS DIFF_MONTH
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) AS INTEGER) AS DIFF_DATE
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) * 24 AS INTEGER) AS DIFF_HOUR
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) * 24 * 60 AS INTEGER) AS DIFF_MINUTE
, CAST((JULIANDAY(DATE_ED) - JULIANDAY(DATE_ST)) * 24 * 60 * 60 AS INTEGER) AS DIFF_SECOND
FROM TESTDATE
STRTIME 함수에 대한 자세한 사항은 아래 사이트에서 확인 가능합니다.
https://www.ibm.com/docs/ko/i/7.3?topic=functions-strftime-convert-datetime-string
strftime() — 날짜/시간을 스트링으로 변환
형식 #include size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr); 로케일 감지 이 함수의 작동은 현재 로케일의 LC_CTYPE, LC_TIME, LC_TOD 범주로 영향을 받을 수 있습니다. 자세한 정보는
www.ibm.com
※ 이 글은 워드프레스에 작성한 글과 동일한 작성자의 동일한 글입니다.
https://royfactory.net/2023/07/03/sqlite-to-lookup-date-diff/
[SQLite] How to look up the date interval (Date Diff) - ROY FACTORY
Can SQL calculate the difference between two dates? In this article, we look at the day of Julian and calculate the interval between the two dates.
royfactory.net
'개발 창고 > Database' 카테고리의 다른 글
[SQLite] How to Look Up the Date Interval (Date Diff) (3) | 2023.12.11 |
---|---|
[SQLite] 마지막으로 입력 된 ID 가져오는 방법 (0) | 2023.07.28 |
[MSSQL] SQL Error [14607] [S0001]: profile 이름이 잘못되었습니다. (0) | 2023.03.20 |
[MSSQL] SEQUENCE 사용하기 (0) | 2023.03.09 |
[MySQL] Limit 사용하기 (0) | 2023.02.22 |