[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.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.날짜 / 시간 형식에 대한 SQLite는의 지원은 매우 제한됩니다. 당신은 시간 정보를 유지하기위한 롤 - 네 - 자신의 방법이있을 수 있습니다. 적어도, 그게 내가 무슨 짓을했는지.
날짜 / 시간 형식에 대한 SQLite는의 지원은 매우 제한됩니다. 당신은 시간 정보를 유지하기위한 롤 - 네 - 자신의 방법이있을 수 있습니다. 적어도, 그게 내가 무슨 짓을했는지.
당신은 SQLite는 create_function () API를 사용하여 비교를하기 위해 자신의 저장-함수를 정의 할 수 있습니다.
-
==============================
3.가장으로서 나는 시간대의 지정을 포함하는 완전히 합리적, 말할 수있다; 텍스트가 "10 캔을 통해 2 형식을 지정합니다.."를 참조하십시오. http://www.sqlite.org/lang_datefunc.html에서 그러나, 문제는 날짜 함수는 날짜로 타임 스탬프를 해석한다는 것이다. 그래서 실제 비교를 위해, 당신도 날짜 함수 또는 저장 것 같은 그 문자열 비교 작업을 통해 타임 스탬프를 통과해야합니다. 한 가지 방법은 당신이 삽입하고 select 문에있는 모든 리터럴 값을하는 모든 값에 날짜를 호출하도록 응용 프로그램을 코딩하는 것입니다. 많은 응용 프로그램에서 쉽게 할 수있는 기존 응답에 의해 제안 그러나, 단순히 시간대를 포함하지 않음.
가장으로서 나는 시간대의 지정을 포함하는 완전히 합리적, 말할 수있다; 텍스트가 "10 캔을 통해 2 형식을 지정합니다.."를 참조하십시오. http://www.sqlite.org/lang_datefunc.html에서 그러나, 문제는 날짜 함수는 날짜로 타임 스탬프를 해석한다는 것이다. 그래서 실제 비교를 위해, 당신도 날짜 함수 또는 저장 것 같은 그 문자열 비교 작업을 통해 타임 스탬프를 통과해야합니다. 한 가지 방법은 당신이 삽입하고 select 문에있는 모든 리터럴 값을하는 모든 값에 날짜를 호출하도록 응용 프로그램을 코딩하는 것입니다. 많은 응용 프로그램에서 쉽게 할 수있는 기존 응답에 의해 제안 그러나, 단순히 시간대를 포함하지 않음.
from https://stackoverflow.com/questions/2930768/how-to-compare-sqlite-timestamp-values by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 엔티티 프레임 워크 - 저장 프로 시저의 반환 값 (0) | 2020.04.26 |
---|---|
[SQL] 정규 표현식은 일반 SQL 구문에 맞게? (0) | 2020.04.26 |
[SQL] 어디 문에서 SQL을 사용하여 별칭 (0) | 2020.04.26 |
[SQL] 잠금 장치의 총 수는 로크 테이블 크기를 초과 (0) | 2020.04.26 |
[SQL] IN () 절에 SQL 매개 변수를 전달하면 .NET에서 데이터 집합을 입력하여 (0) | 2020.04.26 |