【问题标题】:sqlalchemy filter by comparing datetime.now() and column default datesqlalchemy 通过比较 datetime.now() 和列默认日期进行过滤
【发布时间】:2015-05-05 16:44:02
【问题描述】:

在我的表定义中,我有一个这样定义的列:

created_date = Column(DateTime, nullable=False, default=datetime.now)

我想在其创建日期等于当前日期时查询一个实例(例如,如果它是今天创建的)。

所以我尝试了这样的事情:

res = session.query(Object).filter(datetime.now() == Object.created_date)

它永远不会起作用,因为我猜两个日期是在几秒钟内比较的,所以它们永远不会彼此相等。然后我尝试了这个:

res = session.query(Object).filter((datetime.now() - Object.created_date).days < 1)

虽然(datetime.now() - datetime.now()).days 在 python 中工作,但在我这里的情况下它不起作用。我收到错误消息:“BinaryExpression”对象和“比较器”对象都没有属性“天”。

那么我应该如何进行查询以过滤当天创建的实例?谢谢!

【问题讨论】:

  • 好吧,它实际上不起作用。通过说它有效,我的意思是它将返回一个值为 -1。
  • 您使用的是哪个日期时间库和哪个版本的python?我只是不认为 datetime 实例有 days 属性

标签: python sqlite datetime sqlalchemy


【解决方案1】:

我怀疑(datetime.now() - datetime.now()).days 是否有效,因为datetime.datetime 实例仅具有名为day 而不是days 的属性。使用datetime.now().days 将导致AttributeError: 'datetime.datetime' object has no attribute 'days'

你可以试试这个:

from datetime import timedelta

res = session.query(Object).filter(
    (Object.created_date+timedelta(days=1))>datetime.now())

【讨论】:

  • 是的!这完美!我做from datetime import datetime 并使用python 2.7。 datetime.now() - datetime.now() 将成为一个 timedelta 对象,它具有days 属性。感谢您的帮助!
  • @shangyeshen 哎呀,看起来(datetime.now()-datetime.now()).days 工作。所以你的原始代码产生错误可能是因为datetime.now() 与 SQLAlcehmy 的DateTime 类型的Object.created_date 并不真正兼容?需要调查...
【解决方案2】:

您想要获取已创建日期 == 当前日期的行 比如你的表格列

|身份证 |已创建 |

| 1 | 2019-02-13 12:48:49 |

| 2 | 2019-02-14 12:48:49 |

| 3 | 2019-02-14 12:48:49 |

今天是:2019-02-14

你可以试试这个

from sqlalchemy import exc, extract
from datetime import datetime, date, timedelta    

res = session.query(Object).filter(
      extract('month', Object.created) >= datetime.today().month,
      extract('year', Object.created) >= datetime.today().year,
      extract('day', Object.created) >= datetime.today().day)
     ).all()

你会得到输出:

|身份证 |已创建 |

| 2 | 2019-02-14 12:48:49 |

| 3 | 2019-02-14 12:48:49 |

你可以找到更多HERE

【讨论】:

  • 但如果表中包含 2030-01-10 ,则不会出现在结果中,因为虽然年份更大,但日期和月份小于今天的日期和月份
【解决方案3】:

这就是我获取与某个日期或特定日期相关的所有条目的方式。

from datetime import date

start = date(year=2019, month=12, day=30)
today_date = date.today()

with DBConx(TEST_METRICS) as db_conx:
    answer =  db_conx.the_session.query(TestRun).filter(
        (TestRun.datetime) >= start)

    # This will print all entries from the start date.
    print (len(answer.all()))

    answer =  db_conx.the_session.query(TestRun).filter(
        (TestRun.datetime) == the_date)

    # This will print all entries of today.
    print (answer.all())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多