SQLite에서 두 날짜 사이의 일 차이를 어떻게 얻습니까? 나는 이미 다음과 같은 것을 시도했습니다.
SELECT Date('now') - DateCreated FROM Payment
매번 0을 반환합니다.
SQLite에서 두 날짜 사이의 일 차이를 어떻게 얻습니까? 나는 이미 다음과 같은 것을 시도했습니다.
SELECT Date('now') - DateCreated FROM Payment
매번 0을 반환합니다.
답변:
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
DateCreated
UTC에있는 경우 작동합니다 . 대신 현지 시간 인 경우 현지 시간으로 변환 julianday('now')
해야합니다. 이 정보가있는 곳을 찾을 수 없습니다. julianday('now') - julianday(DateCreated)
이 게시물이 현지 시간으로 저장된 날짜로 제안하는 것을 좋아 한다면 귀하의 답변은 GMT에서 오프셋되어 틀릴 것입니다. 현지 시간으로 날짜를 저장하는 것이 가장 좋은 방법은 아니지만 시간대가 중요하지 않은 앱에서는 여전히 발생할 수 있습니다 (여기와 같이 작업중인 도구가 날짜를 강제하는 경우 제외).
julianday('now') - julianday(DateCreated, 'utc')
두 가지 모두 UTC를 만들려면을 수행하는 것과 동일한 방식으로 작동하지 않습니다 julianday('now', 'localtime') - julianday(DateCreated)
. 전자는 DST 일을 고려하지 않으며 3 월 -11 월에 생성 된 날짜에 추가 시간을 추가합니다. 후자는 실제로 그것을 설명합니다. stackoverflow.com/questions/41007455/...
일수 차이
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) As Integer)
시간 차이
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 As Integer)
분 차이
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 As Integer)
초 차이
Select Cast ((
JulianDay(ToDate) - JulianDay(FromDate)
) * 24 * 60 * 60 As Integer)
두 답변 모두 필요에 따라 조금 더 복잡한 솔루션을 제공합니다. 에 결제가 생성되었다고 가정 해 보겠습니다 January 6, 2013
. 그리고 우리는이 날짜와 오늘의 차이를 알고 싶습니다.
sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557
차이는 34 일입니다. julianday('now')
더 나은 명확성을 위해 사용할 수 있습니다 . 즉, 기능을 수행하기 위해 매개 변수로 입력 date()
하거나 datetime()
기능 할 필요가 없습니다
julianday()
.
SQLite 문서는 훌륭한 참조이며 DateAndTimeFunctions 페이지는 북마크하기 좋은 .
sqlite 명령 줄 유틸리티로 쿼리를 실행하는 것이 매우 쉽다는 것을 기억하는 것도 도움이됩니다.
sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55
이 대답은 약간 길고 문서는 이것을 알려주지 않지만 (데이터베이스에 UTC 날짜로 날짜를 저장한다고 가정하기 때문에)이 질문에 대한 대답은 주로 날짜가 저장된 시간대에 따라 다릅니다. in. 또한을 사용하지 않고 함수를 Date('now')
사용하여 julianday()
공통 날짜에 대해 두 날짜를 모두 계산 한 다음 해당 결과의 차이를 서로 뺍니다.
날짜가 UTC로 저장되는 경우 :
SELECT julianday('now') - julianday(DateCreated) FROM Payment;
이것은 최상위 답변이 가지고 있으며 문서 에도 있습니다. . 이것은 그림의 일부일 뿐이며 저에게 묻는다면 매우 단순한 대답입니다.
날짜가 현지 시간으로 저장되어있는 경우 위의 코드를 사용하면 GMT 오프셋의 시간 수만큼 잘못된 답변 이됩니다. 나와 같은 미국 동부 (GMT -5)에있는 경우 결과에 5 시간이 추가됩니다. 그리고 GMT 날짜에 위배 DateCreated
되기 때문에 UTC 를 준수 하려고하면 julianday('now')
:
SELECT julianday('now') - julianday(DateCreated, 'utc') FROM Payment;
여기에는 DateCreated
일광 절약 시간 (3 월 -11 월) 에 한 시간이 추가되는 버그가 있습니다 . "지금"이 DST가 아닌 날 정오이고 6 월 (DST 중)에 정오에 무언가를 만들었다 고 가정하면 결과는 시간 부분에 대해 0 시간이 아닌 1 시간 간격을 제공합니다. 결과를 수정하고 DST 날짜에서 1 시간을 빼려면 결과를 표시하는 애플리케이션 코드에 함수를 작성해야합니다. 내가 겪고있는 문제에 대한 더 나은 해결책이 있다는 것을 깨달을 때까지 그렇게했습니다. SQLite vs. Oracle-날짜 차이 계산-시간
대신 나에게 지적했듯이 현지 시간으로 저장된 날짜의 경우 두 가지를 모두 현지 시간과 일치 시키십시오.
SELECT julianday('now', 'localtime') - julianday(DateCreated) FROM Payment;
또는 'Z'
현지 시간에 추가 :
julianday(datetime('now', 'localtime')||'Z') - julianday(CREATED_DATE||'Z')
이 두 가지 모두 DST 날짜에 대해 추가 시간을 추가하지 않고 곧바로 뺄셈을 수행합니다. 따라서 DST가 아닌 날 정오에 확인할 때 DST 당일 정오에 생성 된 항목은 다음과 같은 경우 추가 시간을 얻지 않습니다. 계산을 수행합니다.
그리고 대부분의 사람들이 데이터베이스에 현지 시간으로 날짜를 저장하지 말고 UTC로 저장하지 말라고 말할 것이지만 모든 응용 프로그램에 전 세계 사용자가있는 것은 아니며 모든 프로그래머가 원하는 것은 아닙니다. 시스템의 모든 날짜를 UTC로 변환하고 데이터베이스에서 GET 또는 SET을 수행 할 때마다 다시 돌아가서 무언가가 로컬인지 또는 UTC인지 알아내는 작업을 수행합니다.
타임 클록 기능 작성에 대한 참고 사항입니다. 근로 시간을 찾는 사람들의 경우, 아주 간단한 변경으로 대부분의 급여 회사가 원하는대로 시간과 분이 60의 백분율로 표시됩니다.
CAST ((julianday(clockOUT) - julianday(clockIN)) * 24 AS REAL) AS HoursWorked
Clock In Clock Out HoursWorked
2016-08-07 11:56 2016-08-07 18:46 6.83333332836628
00:00 형식으로 시간을 원하면 다음과 같이 해결했습니다.
select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something
날짜 형식이 "YYYY-MM-DD HH : MM : SS"인 경우 두 날짜 간의 월 수 차이를 찾아야하는 경우 :
(strftime('%m', date1) + 12*strftime('%Y', date1)) -
(strftime('%m', date2) + 12*strftime('%Y', date2))
첫째, 날짜 형식이 무엇인지 명확하지 않습니다. 이미 관련 답변이 strftime("%s")
있습니다.
나는 그 대답을 확장하고 싶습니다.
SQLite에는 NULL, INTEGER, REAL, TEXT 또는 BLOB와 같은 스토리지 클래스 만 있습니다. 단순화하기 위해 1970-01-01 이후의 초를 포함하는 날짜가 REAL이라고 가정하겠습니다. 다음은 "2018 년 12 월 1 일"의 샘플 데이터를 입력 할 샘플 스키마입니다.
CREATE TABLE Payment (DateCreated REAL);
INSERT INTO Payment VALUES (strftime("%s", "2018-12-01"));
이제 "2018 년 12 월 1 일"과 지금의 날짜 차이를 계산해 봅시다 (이 글은 2018 년 12 월 12 일 정오입니다).
날짜 차이 :
SELECT (strftime("%s", "now") - DateCreated) / 86400.0 FROM Payment;
-- Output: 11.066875
시간의 날짜 차이 :
SELECT (strftime("%s", "now") - DateCreated) / 3600.0 FROM Payment;
-- Output: 265.606388888889
날짜 차이 (분) :
SELECT (strftime("%s", "now") - DateCreated) / 60.0 FROM Payment;
-- Output: 15936.4833333333
날짜 차이 (초) :
SELECT (strftime("%s", "now") - DateCreated) FROM Payment;
-- Output: 956195.0
날짜 사이에 기록을 원하면
select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;
제 경우에는 차이를 분 단위로 계산 julianday()
해야하며 정확한 값을 제공하지 않습니다. 대신 다음을 사용합니다 strftime()
.
SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60
두 날짜 모두 유닉스 타임 (초)으로 변환 된 다음 빼서 두 날짜 사이의 값을 초 단위로 얻습니다. 다음으로 60으로 나눕니다.