Django MySQL и CONVERT_TZ

Мне нужно узнать продолжительность некоторых событий в моей базе данных MySQL. Вокруг DST продолжительность в UTC отличается от продолжительности в местном времени, и мне нужно знать их в местном времени.

Я нашел способ сделать это, но мне интересно, можно ли улучшить эту функцию.

from django.db.models import ExpressionWrapper, F, fields
from django.db.models.functions import Cast
from django.db.models.expressions import RawSQL


duree = ExpressionWrapper(F('_dtend') - F('_dtstart'), output_field=fields.DurationField())

event_dur = Event.objects.annotate(
    _dtstart=Cast(
        RawSQL("CONVERT_TZ(dtstart, 'UTC', timezone)", ()), fields.DateTimeField()
    ),
    _dtend=Cast(RawSQL("CONVERT_TZ(dtend, 'UTC',timezone)", ()), fields.DateTimeField()),
).annotate(
    dur=duree
)

Без convert_tz я нахожу 8000 событий, с convert_tz - только 1000. Вероятно, 7000 событий произошли в районе DST в октябре прошлого года.

Итак, продолжительность работает нормально. Отлично. Проблема решена. Однако если я сделаю:

event_dur.first()._dtstart, event_dur.first().dtstart

Мне отвечают:

datetime.datetime(2024, 11, 22, 0, 0, tzinfo=datetime.timezone.utc), datetime.datetime(2024, 11, 21, 23, 0, tzinfo=datetime.timezone.utc)

Как вы можете видеть, в _dtstart (который использует Europe/Amsterdam btw) указано правильное время, но tzinfo неверно (должно быть 'Europe/Amsterdam'). Хотя в течение всего времени это не является большой проблемой, я хотел бы узнать, есть ли способ включить правильную информацию о часовом поясе непосредственно из базы данных?

Вернуться на верх