为什么此 SQL 语句会产生错误的时间戳?
Why does this SQL statement produce a wrong timestamp?
声明
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语句好像差了将近一秒?
您的问题在于使用 datetime
的内部 select。如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
声明
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语句好像差了将近一秒?
您的问题在于使用 datetime
的内部 select。如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