【问题标题】:update or convert a date time value in a sqlite database更新或转换 sqlite 数据库中的日期时间值
【发布时间】:2019-11-09 13:39:48
【问题描述】:

我有一个带有 TEXT 列的 SQLite 数据库,该列存储格式如下的 DateTime 值:'11/08/2019 00:00:00'。我想将整个列内容转换为 UTC Epoch 时间戳本地时区。 是否有一个带有 DateTime 函数的 Update SQL 字符串,我可以使用支持的 SQL 语法运行它来执行此任务,或者我应该只编写一个快速的 C# 控制台应用程序来执行此任务吗? 我没有在网上或 SO 中找到任何可以在这种情况下做我需要做的事情的例子。

【问题讨论】:

  • 如果您将日期字符串格式更改为 sqlite date and time functions 支持的格式,那么我认为是这样(不太确定“本地时区”与基于 UTC 的 Unix 纪元时间有什么关系.. .)

标签: sqlite datetime


【解决方案1】:

一个UPDATE SQL,例如:-

UPDATE mytable SET mycolumn = 
CASE WHEN substr(mycolumn,3,1) = '/' 
    THEN
        strftime('%s',substr(mycolumn,7,4)||'-'||substr(mycolumn,4,2)||'-'||substr(mycolumn,1,2)||' '||substr(mycolumn,12,8))
    ELSE
        mycolumn
    END
; 

可以使用。

示例

也许考虑以下将转换列(或者如果它已经被转换(或者如果它与 dd/mm/yyyy 格式不匹配)则不转换)

  • 请注意,下面仅检查第三个字符是否为 /,如果需要,可以使用更严格的检查。

:-

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mycolumn TEXT);
/* Load the testing data */
INSERT INTO mytable VALUES 
    ('11/08/2019 00:00:00'),
    ('01/08/2019 00:00:00'),
    ('31/01/2019 00:00:00'),
    ('31/01/2019 13:25:33.004') /* test for micro seconds (dropped by utc)*/;
/* display data before conversion */
SELECT * FROM mytable; 
/* Convert the data to unix */
UPDATE mytable SET mycolumn = 
    CASE WHEN substr(mycolumn,3,1) = '/' 
        THEN
            strftime('%s',substr(mycolumn,7,4)||'-'||substr(mycolumn,4,2)||'-'||substr(mycolumn,1,2)||' '||substr(mycolumn,12,8))
        ELSE
            mycolumn
        END
    ;
    /* Display data as is, as formatted localised and as formatted UTC */
SELECT *, datetime(mycolumn,'unixepoch','localtime') AS local, datetime(mycolumn,'unixepoch') AS utc FROM mytable;
  • 请注意,上述内容不适用于 2019 年 1 月 1 日等日期,此类日期需要更复杂的 CASE 子句。

  • 请注意,UTC 是全球协调时间,即存储一个值,您可以根据时区从 UTC 进行调整

结果

  • 注意在 +10 小时的时区进行测试

第一次运行的结果是:-

转换前:-

转换后

重新运行(DROP 被注释掉)

转换前(混合数据):-

  • 圈出的数据已经转换

转换后:-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2017-12-31
    • 2010-12-28
    • 1970-01-01
    相关资源
    最近更新 更多