【问题标题】:Why does this SQL statement produce a wrong timestamp?为什么这条 SQL 语句会产生错误的时间戳?
【发布时间】:2020-10-06 00:13:49
【问题描述】:

声明

select strftime('%Y-%m-%d %H:%M:%f', (select datetime('2019-07-24 11:11:59', '-288.0110592 seconds')), '+411.030309 seconds')

给我时间戳

2019-07-24 11:14:01.030

用 Python 验证结果,发现结果延迟了大约一秒。

我的 Python 代码:

import datetime
start = datetime.datetime.strptime('2019-07-24 11:11:59', '%Y-%m-%d %H:%M:%S')
offset1 = datetime.timedelta(seconds=288.0110592)
offset2 = datetime.timedelta(seconds=411.030309)
result = start - offset1 + offset2
print(result.strftime('%Y-%m-%d %H:%M:%S.%f'))

输出:

2019-07-24 11:14:02.019250

由于舍入错误,我没想到结果会完全相等,但是为什么 SQL 语句似乎差了将近一秒?

【问题讨论】:

    标签: sql sqlite datetime strftime


    【解决方案1】:

    您的问题在于使用datetime 的内部选择。如manual中所述,datetime(...)等价于strftime('%Y-%m-%d %H:%M:%S', ...),你会注意到秒的格式是%S,而不是%f,所以结果是

    datetime('2019-07-24 11:11:59', '-288.0110592 seconds')
    

    2019-07-24 11:07:10.000
    

    不是正确的值(带有小数秒)

    2019-07-24 11:07:10.989
    

    datetime(...) 调用更改为strftime('%Y-%m-%d %H:%M:%f', ...)

    strftime('%Y-%m-%d %H:%M:%f', '2019-07-24 11:11:59', '-288.0110592 seconds')
    

    产生正确的结果。

    请注意,您可以简化表达式并在对strftime 的外部调用中使用这两个修饰符:

    select strftime('%Y-%m-%d %H:%M:%f', '2019-07-24 11:11:59', '-288.0110592 seconds', '+411.030309 seconds')
    

    输出:

    2019-07-24 11:14:02.019
    

    Demo on dbfiddle

    【讨论】:

    • 非常感谢您的大力帮助。我的后续问题已解决。
    • @actual_panda 不用担心 - 我很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2015-05-15
    • 2023-03-20
    • 2019-11-15
    • 2018-03-17
    相关资源
    最近更新 更多