How to compare sqlite TIMESTAMP values

后端 未结 3 555
走了就别回头了
走了就别回头了 2020-11-28 10:32

I have an Sqlite database in which I want to select rows of which the value in a TIMESTAMP column is before a certain date. I would think this to be simple but I can\'t get

3条回答
  •  失恋的感觉
    2020-11-28 11:20

    The issue is with the way you've inserted data into your table: the +0200 syntax doesn't match any of SQLite's time formats:

    1. YYYY-MM-DD
    2. YYYY-MM-DD HH:MM
    3. YYYY-MM-DD HH:MM:SS
    4. YYYY-MM-DD HH:MM:SS.SSS
    5. YYYY-MM-DDTHH:MM
    6. YYYY-MM-DDTHH:MM:SS
    7. YYYY-MM-DDTHH:MM:SS.SSS
    8. HH:MM
    9. HH:MM:SS
    10. HH:MM:SS.SSS
    11. now
    12. DDDDDDDDDD

    Changing it to use the SS.SSS format works correctly:

    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
    

    If you absolutely can't change the format when it is inserted, you might have to fall back to doing something "clever" and modifying the actual string (i.e. to replace the + with a ., etc.).


    (original answer)

    You haven't described what kind of data is contained in your CREATED_AT column. If it indeed a datetime, it will compare correctly against a string:

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

    If it is stored as a unix timestamp, you need to call DATETIME function with the second argument as 'unixepoch' to compare against a string:

    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
    

    If neither of those solve your problem (and even if they do!) you should always post some data so that other people can reproduce your problem. You should even feel free to come up with a subset of your original data that still reproduces the problem.

提交回复
热议问题