How can I store the current timestamp in SQLite as ticks?

前端 未结 3 1801
攒了一身酷
攒了一身酷 2020-12-10 13:41

I have a SQLite database where I store the dates as ticks. I am not using the default ISO8601 format. Let\'s say I have a table defined as follows:

CREATE TA         


        
相关标签:
3条回答
  • 2020-12-10 14:08

    This particular oddity of SQLite caused me much anguish.

    Easy way - store and retrieve as regular timestamp

    create table TestDate (
            LastModifiedTime datetime
    );
    insert into TestDate (LastModifiedTime) values (datetime('now'));
    select datetime(LastModifiedTime), strftime('%s.%f', LastModifiedTime)  from TestDate;
    

    Output: 2011-05-10 21:34:46|1305063286.46.000

    Painful way - store and retrieve as a UNIX timestamp

    You can use strftime to retrieve the value in ticks. Additionally, to store a UNIX timestamp (roughly equivalent to ticks), you can can surround the number of seconds in single-quotes.

     insert into TestDate (LastModifiedTime) values ('1305061354');
    

    SQLite will store this internally as some other value that is not a UNIX timestamp. On retrieval, you need to explicitly tell SQLite to retrieve it as a UNIX timestamp.

     select datetime(LastModifiedTime, 'unixepoch') FROM TestDate;
    

    To store the current date and time, use strftime('%s', 'now').

     insert into TestDate (LastModifiedTime) VALUES (strftime('%s', 'now'));
    

    Full example:

    create table TestDate (
            LastModifiedTime datetime
    );      
    insert into TestDate (LastModifiedTime) values (strftime('%s', 'now'));
    select datetime(LastModifiedTime, 'unixepoch') from TestDate;
    

    When executed by sqlite3, this script with print:

    2011-05-10 21:02:34 (or your current time)
    
    0 讨论(0)
  • 2020-12-10 14:17

    After further study of the SQLite documentation and other information found on date number conversions, I have come up with the following formula, which appears to produce correct results:

    INSERT INTO TestDate(LastModifiedTime)
        VALUES(CAST((((JulianDay('now', 'localtime') - 2440587.5)*86400.0) + 62135596800) * 10000000 AS BIGINT))
    

    Seems like a painful way to produce something that I would expect to be available as a built-in datetime format, especially that the database supports the storing of datetime values in ticks. Hopefully, this becomes useful for others too.

    Update:

    The above formula is not perfect when it comes to daylight savings. See section Caveats And Bugs in SQLite docs regarding local time calculation.

    0 讨论(0)
  • 2020-12-10 14:28

    The following will return the number of milliseconds since the UNIX Epoch:

    SELECT (strftime('%s', 'now') - strftime('%S', 'now') + strftime('%f', 'now')) * 1000 AS ticks
    

    It works by grabbing the number of seconds since the Unix Epoch (%s), subtracting the number of seconds in the current time (%S), adding the number of seconds with decimal places (%f), and multiplying the result by 1000 to convert from seconds to milliseconds.

    The subtraction and addition are to add precision to the value without skewing the result. As stated in the SQLite Documentation, all uses of 'now' within the same step will return the same value.

    0 讨论(0)
提交回复
热议问题