복붙노트

[SQL] 어떻게 SQLite는 TIMESTAMP 값을 비교

SQL

어떻게 SQLite는 TIMESTAMP 값을 비교

나는 타임 스탬프 열의 값이 특정 날짜 이전으로있는 행을 선택하려는에서 SQLite 데이터베이스가 있습니다. 나는 이것이 단순하게 생각하지만 난 그것을 끝낼 수 없습니다. 나는이 시도했다 :

SELECT * FROM logged_event WHERE logged_event.CREATED_AT < '2010-05-28 16:20:55'

그리고 다양한 변화, 날짜 기능을 좋아한다. 나는 http://sqlite.org/lang_datefunc.html 및 http://www.sqlite.org/datatypes.html 읽은 나는 열이 숫자 형식이 될 것이라고 기대하고 비교에서 할 것 유닉스 타임 스탬프 값입니다. Apparantly 히 없습니다. 도움이 될 수 있습니다 누구? 이 중요한 경우에, 나는 SQLite는 전문가 개인이 아웃을 시도하고있다.

편집하다:

여기 형 테이블 설명입니다 :

CREATE TABLE [logged_event]
(
[id] INTEGER  NOT NULL PRIMARY KEY,
[created_at] TIMESTAMP,
[name] VARCHAR(64),
[data] VARCHAR(512)
);

그리고 테스트 데이터 :

INSERT INTO table VALUES(1,'2010-05-28T15:36:56+0200','test','test');
INSERT INTO table VALUES(2,'2010-05-28T16:20:49+0200','test','test');
INSERT INTO table VALUES(3,'2010-05-28T16:20:51+0200','test','test');
INSERT INTO table VALUES(4,'2010-05-28T16:20:52+0200','test','test');
INSERT INTO table VALUES(5,'2010-05-28T16:20:53+0200','test','test');
INSERT INTO table VALUES(6,'2010-05-28T16:20:55+0200','test','test');
INSERT INTO table VALUES(7,'2010-05-28T16:20:57+0200','test','test');

해결법

  1. ==============================

    1.0200 구문 SQLite는의 시간 형식과 일치하지 않습니다 문제는 당신이 당신의 테이블에 데이터를 삽입 한 방식에 있습니다 :

    0200 구문 SQLite는의 시간 형식과 일치하지 않습니다 문제는 당신이 당신의 테이블에 데이터를 삽입 한 방식에 있습니다 :

    를 변경하면 SS.SSS 형식의 작품을 올바르게 사용하는 방법 :

    sqlite> CREATE TABLE Foo (created_at TIMESTAMP);
    sqlite> INSERT INTO Foo VALUES('2010-05-28T15:36:56+0200');
    sqlite> SELECT * FROM Foo WHERE foo.created_at < '2010-05-28 16:20:55';
    sqlite> SELECT * FROM Foo WHERE DATETIME(foo.created_at) < '2010-05-28 16:20:55';
    sqlite> INSERT INTO Foo VALUES('2010-05-28T15:36:56.200');
    sqlite> SELECT * FROM Foo WHERE DATETIME(foo.created_at) < '2010-05-28 16:20:55';
    2010-05-28T15:36:56.200
    

    이 삽입 될 때 당신이 절대적으로 형식을 변경할 수 없다면, 당신은 다시 "영리"뭔가를하고 실제 문자열을 수정하는 가을해야 할 수도 있습니다 (즉,은으로 +를 대체한다. 등).

    (원래의 대답)

    당신은 당신의 CREATED_AT 열에 포함되는 종류의 데이터를 어떻게 설명하지 않았다. 실제로 그것을 날짜 경우 문자열에 대해 올바르게 비교합니다 :

    sqlite> SELECT DATETIME('now');
    2010-05-28 16:33:10
    sqlite> SELECT DATETIME('now') < '2011-01-01 00:00:00';
    1
    

    이 유닉스 타임 스탬프로 저장되어있는 경우, 당신은 문자열에 대해 비교하는 'unixepoch'로 두 번째 인수로 DATETIME 함수를 호출해야합니다

    sqlite> SELECT DATETIME(0, 'unixepoch');
    1970-01-01 00:00:00
    sqlite> SELECT DATETIME(0, 'unixepoch') < '2010-01-01 00:00:00';
    1
    sqlite> SELECT DATETIME(0, 'unixepoch') == DATETIME('1970-01-01 00:00:00');
    1
    

    그 중 어느 것도 문제를 (그리고 그들이 할 경우에도!) 해결하면 다른 사람들이 당신의 문제를 재현 할 수 있도록 항상 일부 데이터를 게시해야한다. 당신은 여전히 ​​문제가 재생 원본 데이터의 하위 집합을 마련 부담해야한다.

  2. ==============================

    2.날짜 / 시간 형식에 대한 SQLite는의 지원은 매우 제한됩니다. 당신은 시간 정보를 유지하기위한 롤 - 네 - 자신의 방법이있을 수 있습니다. 적어도, 그게 내가 무슨 짓을했는지.

    날짜 / 시간 형식에 대한 SQLite는의 지원은 매우 제한됩니다. 당신은 시간 정보를 유지하기위한 롤 - 네 - 자신의 방법이있을 수 있습니다. 적어도, 그게 내가 무슨 짓을했는지.

    당신은 SQLite는 create_function () API를 사용하여 비교를하기 위해 자신의 저장-함수를 정의 할 수 있습니다.

  3. ==============================

    3.가장으로서 나는 시간대의 지정을 포함하는 완전히 합리적, 말할 수있다; 텍스트가 "10 캔을 통해 2 형식을 지정합니다.."를 참조하십시오. http://www.sqlite.org/lang_datefunc.html에서 그러나, 문제는 날짜 함수는 날짜로 타임 스탬프를 해석한다는 것이다. 그래서 실제 비교를 위해, 당신도 날짜 함수 또는 저장 것 같은 그 문자열 비교 작업을 통해 타임 스탬프를 통과해야합니다. 한 가지 방법은 당신이 삽입하고 select 문에있는 모든 리터럴 값을하는 모든 값에 날짜를 호출하도록 응용 프로그램을 코딩하는 것입니다. 많은 응용 프로그램에서 쉽게 할 수있는 기존 응답에 의해 제안 그러나, 단순히 시간대를 포함하지 않음.

    가장으로서 나는 시간대의 지정을 포함하는 완전히 합리적, 말할 수있다; 텍스트가 "10 캔을 통해 2 형식을 지정합니다.."를 참조하십시오. http://www.sqlite.org/lang_datefunc.html에서 그러나, 문제는 날짜 함수는 날짜로 타임 스탬프를 해석한다는 것이다. 그래서 실제 비교를 위해, 당신도 날짜 함수 또는 저장 것 같은 그 문자열 비교 작업을 통해 타임 스탬프를 통과해야합니다. 한 가지 방법은 당신이 삽입하고 select 문에있는 모든 리터럴 값을하는 모든 값에 날짜를 호출하도록 응용 프로그램을 코딩하는 것입니다. 많은 응용 프로그램에서 쉽게 할 수있는 기존 응답에 의해 제안 그러나, 단순히 시간대를 포함하지 않음.

  4. from https://stackoverflow.com/questions/2930768/how-to-compare-sqlite-timestamp-values by cc-by-sa and MIT license