Я видел, что в postgresql мы можем привести дату и время к timestamp
или timestamptz
, что равно TIMESTAMP WITHOUT TIME ZONE
или TIMESTAMP WITH TIME ZONE
.
Например, используя psql(Postgres shell)
:
db=# select '2023-03-31 00:00:00'::timestamp;
timestamp
---------------------
2023-03-31 00:00:00
или
db=# select '2023-03-31 00:00:00'::timestamptz;
timestamptz
------------------------
2023-03-31 00:00:00+00
Второй пример — это именно то, что я пытаюсь сделать с помощью SqlAlchemy.
Я знаю, что мы можем использовать Model.created_date.cast(TIMESTAMP)
, как и в первом примере, но мне нужно преобразовать created_date
в timestamptz
.
Цель этого состоит в том, чтобы извлечь некоторые части этой даты во многих разных часовых поясах.
кроме того, поле в моей модели такое:
created_date = Column(DateTime, nullable=False, default=datetime.utcnow)
Вы можете передать timezone=True
типу TIMESTAMP
для PostgreSQL:
from sqlalchemy import create_engine, cast, select, text
from sqlalchemy.dialects.postgresql import TIMESTAMP
engine = create_engine("postgresql://…")
qry = select(cast(text("'2023-03-31 00:00:00'"), TIMESTAMP(timezone=True)))
print(qry.compile(engine))
# SELECT CAST('2023-03-31 00:00:00' AS TIMESTAMP WITH TIME ZONE) AS anon_1
Согласно документам Отметка времени: используйте аргумент TIMESTAMP.timezone, чтобы включить «TIMESTAMP WITH TIMEZONE» для этих бэкэндов.