Существуют некоторые проблемы при использовании Sqlalchemy для запроса данных между временами 1 и 2

#python #sql-server #sqlalchemy

Вопрос:

Моя база данных-SQL Server 2008.

Тип символа времени, который я хочу запросить в базе данных (например, finishdate), — это datetime2

Мне просто нужны данные между «10-11» и «10-17». При использовании Sqlalchemy я использую

 cast(FinishDate, DATE).between(cast(time1, DATE),cast(time2, DATE))
 

для запроса дат, но он не возвращает никаких данных (я подтверждаю, что должны быть какие-то данные, соответствующие диапазону времени запроса)

==============================================

 from sqlalchemy import DATE


bb = "2021-10-11 12:21:23"  
cc = "2021-10-17 16:12:34"  
record = session.query(sa.Name cast(sa.FinishDate, DATE)).filter(
                cast(sa.SamplingTime, DATE).between(cast(bb, DATE), cast(cc, DATE)),
                sa.SamplingType != 0
            ).all()
 

или

 record = session.query(sa.Name cast(sa.FinishDate, DATE)).filter(
                cast(sa.SamplingTime, DATE)>= cast(bb, DATE),
                sa.SamplingType != 0
            ).all()
 

Оба возвращаются []

Что-то не так с моим кодом, и я не знаю, в чем проблема.

Комментарии:

1. Вы пробовали начинать с bb cc объектов Python datetime.date или datetime.datetime и в качестве них?

2. Да, попробуйте удалить cast звонки и после этого, это может повлиять на сравнение.

3. Но мои входные данные не поддерживают этот метод записи.

Ответ №1:

Это работает на меня, я только изменил ДАТУ, которую вы используете на сегодняшний день

 from sqlalchemy import Date
record = session.query(
    sa.Name cast(sa.FinishDate, Date)
 ).filter(
    cast(sa.SamplingTime, Date).between(
        cast(bb, Date), cast(cc, Date)
    ),
    sa.SamplingType != 0
 ).all()
 

На самом деле первым параметром приведения также может быть строка, поэтому в этом случае можно передать дату как строку в приведении.

 :param expression: A SQL expression, such as a
         :class:`_expression.ColumnElement`
         expression or a Python string which will be coerced into a bound
         literal value.
 

Комментарии:

1. Я так ценю ваше объяснение!

2. Как ты и сказал,у меня это не работает. @Ананд Трипати

3. Странно, что это должно сработать, и это сработало и для меня тоже. можете ли вы проверить дату, которая указана в bb и cc и других переменных, или вы можете просто распечатать(записать) запрос без .all (), он напечатает запрос в необработанном формате