SQLite에서 두 날짜의 차이점


110

SQLite에서 두 날짜 사이의 일 차이를 어떻게 얻습니까? 나는 이미 다음과 같은 것을 시도했습니다.

SELECT Date('now') - DateCreated FROM Payment

매번 0을 반환합니다.

답변:


123
 SELECT julianday('now') - julianday(DateCreated) FROM Payment;

10
함수 이름이 무엇을 생각하게할지에도 불구하고 이것은 며칠보다 더 세분화됩니다. 일수이지만 소수 일 수 있습니다.
lindes

10
julianday는 '일'의 (분수) 수 (예 : 시작 날짜의 정오 UTC 이후 24 시간 기간)를 반환합니다 . 그리니치에서 서쪽으로 12 시간 동안 살지 않는 한 일반적으로 필요한 것은 아닙니다. 예를 들어 런던에 거주하는 경우 오늘 아침은 어제 오후와 같은 7 월입니다.
JulianSymes 2013-08-24

2
DateCreatedUTC에있는 경우 작동합니다 . 대신 현지 시간 인 경우 현지 시간으로 변환 julianday('now')해야합니다. 이 정보가있는 곳을 찾을 수 없습니다. julianday('now') - julianday(DateCreated)이 게시물이 현지 시간으로 저장된 날짜로 제안하는 것을 좋아 한다면 귀하의 답변은 GMT에서 오프셋되어 틀릴 것입니다. 현지 시간으로 날짜를 저장하는 것이 가장 좋은 방법은 아니지만 시간대가 중요하지 않은 앱에서는 여전히 발생할 수 있습니다 (여기와 같이 작업중인 도구가 날짜를 강제하는 경우 제외).
vapcguy

3
DateCreated가 현지 시간이라는 가정하에 julianday('now') - julianday(DateCreated, 'utc')두 가지 모두 UTC를 만들려면을 수행하는 것과 동일한 방식으로 작동하지 않습니다 julianday('now', 'localtime') - julianday(DateCreated). 전자는 DST 일을 고려하지 않으며 3 월 -11 월에 생성 된 날짜에 추가 시간을 추가합니다. 후자는 실제로 그것을 설명합니다. stackoverflow.com/questions/41007455/...
vapcguy

60

일수 차이

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)

1
sqlite 버전 3.12.0의 경우 캐스트 표현식에는 대괄호 안에 AS TYPE이 있습니다. 예 : "Select Cast (5.6 As Integer);" sqlite.org/lang_expr.html#castexpr 그렇지 않으면 정말 유용한 예제입니다.
rob

@rob 감사합니다. 누군가가 전에 그렇게 편집 하자고 제안했습니다. 그러나 Sqlitebrowser에서 시도했을 때 작동하지 않았습니다. 아마도 이전 버전이기 때문일 것입니다. 그 .. 그대로 나는 그것을 유지 그래서
Sayka

방금 SQLitebrowser를 사용했는데 오류 rob이 언급되었습니다 .. 게시물을 현대적인 문구로 수정해도 될까요?
Noumenon

@Noumenon은 편집을 제안하십시오. 여기 sqlitebrowser에서 확인하고 작동하면 반드시 편집을 승인합니다. 시간 내 주셔서 감사합니다.
Sayka

2
이 대답은 수용된 대답 인 IMHO보다 훨씬 더 많은 기능을 갖추고 있습니다.
Marcus Parsons

33

두 답변 모두 필요에 따라 조금 더 복잡한 솔루션을 제공합니다. 에 결제가 생성되었다고 가정 해 보겠습니다 January 6, 2013. 그리고 우리는이 날짜와 오늘의 차이를 알고 싶습니다.

sqlite> SELECT julianday() - julianday('2013-01-06');
34.7978485878557 

차이는 34 일입니다. julianday('now')더 나은 명확성을 위해 사용할 수 있습니다 . 즉, 기능을 수행하기 위해 매개 변수로 입력 date()하거나 datetime()기능 할 필요가 없습니다 julianday() .


확실하지 않지만이 명령이 코드에 있고 2013 년 1 월 6 일 값이 데이터베이스에서 가져온 경우 사용 된 데이터 유형을 고려해야합니다.
NoChance

23

SQLite 문서는 훌륭한 참조이며 DateAndTimeFunctions 페이지는 북마크하기 좋은 .

sqlite 명령 줄 유틸리티로 쿼리를 실행하는 것이 매우 쉽다는 것을 기억하는 것도 도움이됩니다.

sqlite> select julianday(datetime('now'));
2454788.09219907
sqlite> select datetime(julianday(datetime('now')));
2008-11-17 14:13:55

1
이 페이지는 Google 검색 엔진 순위와 함께 제공되므로 현재 링크 : sqlite.org/lang_datefunc.html
markusN

9

이 대답은 약간 길고 문서는 이것을 알려주지 않지만 (데이터베이스에 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인지 알아내는 작업을 수행합니다.


"당신이 저에게 물어 보면 그것은 그림의 일부일 뿐이며 매우 단순한 대답입니다." 그래, 당신 말이 맞아. 하지만 내 대답은 그가 2 년 후 당신의 질문에 대해 질문 한 지 3 분 뒤에 주어졌습니다. 단순하지만 그녀는 그에게 어울리는 것 같았습니다.
Fred

1
@Fred 충분히. 그러나 실제로는 위에서 설명한 것처럼 나를 태워 주었고 그래서 도움이되지 않았습니다. 나는 미래에 이것을 보는 사람이 무슨 일이 일어나고 있는지 정확히 알고 있기 때문에 내가 한 것과 같은 함정에 부딪히지 않았는지 확인하고 싶었습니다.
vapcguy

@Fred, 이것은 아주 좋은 설명이며 무엇을 기대할 수 있는지 잘 모르겠습니다. 답변을 게시 하시겠습니까?
NoChance

설명해 주셔서 감사합니다. 나는 SQLite 사람들이 사람들이 수년에 걸쳐 수용하도록 성장한 표준을 위반하기로 결정했고 불필요하게 복잡한 구현으로 끝났고 날짜 및 시간과 같은 중요한 측면에서 테스트하기가 어려웠는지 잘 모르겠습니다! 응용 프로그램의 모든 날짜가 사람이 기대하는대로 작동하는지 확인하는 데 필요한 테스트 사례의 수를 상상해보십시오!
NoChance

3

타임 클록 기능 작성에 대한 참고 사항입니다. 근로 시간을 찾는 사람들의 경우, 아주 간단한 변경으로 대부분의 급여 회사가 원하는대로 시간과 분이 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

깔끔한 작은 쿼리, 그럼에도 불구하고, :)하지만
vapcguy

3

00:00 형식으로 시간을 원하면 다음과 같이 해결했습니다.

select strftime('%H:%M',CAST ((julianday(FinishTime) - julianday(StartTime)) AS REAL),'12:00') from something

2

날짜 형식이 "YYYY-MM-DD HH : MM : SS"인 경우 두 날짜 간의 월 수 차이를 찾아야하는 경우 :

(strftime('%m', date1) + 12*strftime('%Y', date1)) - (strftime('%m', date2) + 12*strftime('%Y', date2))


2

첫째, 날짜 형식이 무엇인지 명확하지 않습니다. 이미 관련 답변이 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

2

초 단위의 차이를 원한다면

SELECT strftime('%s', '2019-12-02 12:32:53') - strftime('%s', '2019-12-02 11:32:53')

0

날짜 사이에 기록을 원하면

select count(col_Name) from dataset where cast(julianday("now")- julianday(_Last_updated) as int)<=0;

0

제 경우에는 차이를 분 단위로 계산 julianday()해야하며 정확한 값을 제공하지 않습니다. 대신 다음을 사용합니다 strftime().

SELECT (strftime('%s', [UserEnd]) - strftime('%s', [UserStart])) / 60

두 날짜 모두 유닉스 타임 (초)으로 변환 된 다음 빼서 두 날짜 사이의 값을 초 단위로 얻습니다. 다음으로 60으로 나눕니다.

https://www.sqlite.org/cvstrac/wiki?p=DateAndTimeFunctions

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.