MySQL timestamp не удается записать информацию timezone
До сегодняшнего момента я полагал что TIMESTAMP в MySQL должен содержать информацию о timezone
Но столкнувшись с темой на практике получил следующее
mysql> SELECT TIMESTAMPDIFF(HOUR , '2020-12-22T04:10:45+00:00', '2020-12-22T04:10:45+03:00');
+--------------------------------------------------------------------------------+
| TIMESTAMPDIFF(HOUR , '2020-12-22T04:10:45+00:00', '2020-12-22T04:10:45+03:00') |
+--------------------------------------------------------------------------------+
| -3 |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Кроме того. Делая попытку записать данные из python получаю ситуацию тоже свидетельствующую о том, что либо я не понимаю как это должно работать (что вероятнее всего) либо я что-то не так настроил:
from common.mysql_connection import db_connection
from datetime import datetime
import pytz
call_datetime: datetime = pytz.utc.localize(datetime.fromisoformat('2020-12-22 04:10:45'))
in_server = call_datetime.astimezone(pytz.timezone('Europe/Moscow'))
print(call_datetime, in_server)
db_connection.cursor.executemany(
"insert into infinity.calls (row_id, trigger_datetime) values (%s, %s);", [
[
126356,
in_server
],
[
5858585,
call_datetime
]
]
)
# 2020-12-22 04:10:45+00:00 2020-12-22 07:10:45+03:00
Собственно вопрос. Можно ли (и нужно ли) сделать так чтобы было
2020-12-22 04:10:45+00:00 == 2020-12-22 07:10:45+03:00
Привести все значения времени в коде к часовому поясу сервера это не проблема. Я просто не понимаю как это правильно должно выглядеть и работать в MySQL
UPD
insert into test (
ts, # timestamp
dt # datetime
)
values ('2020-12-22 04:10:45+03:00', '2020-12-22 04:10:45+00:00'),
('2020-12-22 04:10:45+03:00', '2020-12-22 04:10:45+00:00');
Ответы (2 шт):
используйте тип DATETIME
Из документации mysql
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.)
Timestamp не зависит от часового пояса (в UNIX, по крайней мере). Это количество секунд от "абсолютного момента времени", полуночи 1 января 1970 года по всемирному координированному времени, UTC (время по Гринвичу без поправок на летнее время). Другими словами, независимо от вашего часового пояса, timestamp представляет момент, который везде одинаков.

