Сравнение метки времени на сегодняшний день в Python SQLAlchemy - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть API в Python с использованием sqlalchemy .

У меня есть строка, которая представляет дату в формате ISO.Я конвертирую его, используя datetime.strptime примерно так: datetime.strptime(ToActionDateTime, '%Y-%m-%dZ').

Теперь мне нужно сравнить значение столбца таблицы, который является timestamp, с этой датой.После преобразования исходной строки ISO примерный пример выглядит следующим образом 2018-12-06 00:00:00.Я должен сравнить это на равенство в зависимости от даты, а не времени, но мне не удается понять это правильно.Любая помощь будет принята.

Пример кода Python:

ToActionDateTimeObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ')
query = query.filter(db.c.Audit.ActionDateTime <= ToActionDateTimeObj)

Редактировать:

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

  from sqlalchemy import Date, cast
  ToActionDateTimeObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ')
  query = query.filter(cast(db.c.Audit.ActionDateTime, Date) <= cast(ToActionDateTimeObj, Date))

1 Ответ

0 голосов
/ 18 декабря 2018

Поскольку Oracle DATE тип данных фактически хранит и дату, и время, приведение к DATE не избавит от значения его временной доли, как это было бы в большинстве других СУБД.Вместо этого можно использовать функцию TRUNC(date [, fmt]), чтобы уменьшить значение только до его части даты.В форме с одним аргументом он усекается до ближайшего дня или другими словами использует 'DD' в качестве модели по умолчанию:

ToActionDateObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ').date()
...
query = query.filter(func.trunc(db.c.Audit.ActionDateTime) <= ToActionDateObj)

Если используется форма с двумя аргументами, то спецификатор точности для дневной точности равен либо 'DDD', 'DD', либо 'J'.

Но это решение скрывает столбец ActionDateTime от возможных индексов.Чтобы сделать индекс запросов дружественным, увеличьте дату ToActionDateObj на один день и используйте меньше, чем сравнение:

ToActionDateObj = datetime.strptime(ToActionDateTime, '%Y-%m-%dZ').date()
ToActionDateObj += timedelta(days=1)
...
query = query.filter(db.c.Audit.ActionDateTime < ToActionDateObj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...