Почему этот оператор SQL дает неверную метку времени? - PullRequest
0 голосов
/ 16 июня 2020

Оператор

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 Кажется, что инструкция отключена почти на секунду?

1 Ответ

1 голос
/ 16 июня 2020

Ваша проблема связана с внутренним выбором с использованием datetime. Как описано в руководстве , 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

Демо на dbfiddle

...