[sqlite] SQLite에서 두 날짜의 차이점

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

SELECT Date('now') - DateCreated FROM Payment

매번 0을 반환합니다.



답변

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


답변

일수 차이

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