python:需要帮助以正确的方式实现 strptime()



我正在尝试查找当前日期和从数据库中提取的日期之间的天数差异(postgresql)

这是我的代码:

    cur.execute('select id, city_id, event_id, duration, DATE(startdate) from main_cityevent where DATE(startdate) <= DATE(NOW())')
    rows = cur.fetchall()
    for city_event in rows:
            startdate = str(city_event[4])
            sd = datetime.strptime(startdate, "%Y-%m-%d")
            diff = datetime.datetime.now() - sd

最后一个命令(diff = datetime.datetime.now() - sd)给了我一个AttributeError。

我做错了什么?

您可能正在导入datetime.datetime(类)而不是datetime(模块)。

通过始终导入datetime模块,您可以同时使用 datetime.datetimedatetime.date ,这更适合您的情况,并且有一个很好的.today()方法。

而且你不需要整个 str() -> strptime() 行程,因为它应该已经是一个 python date 对象。

此外,还可以在查询中减去日期并得到以天为单位的差值:

postgres=# select '2011-07-05'::date - current_date;
 ?column? 
----------
       59
(1 row)

所以你的查询会像

SELECT id, city_id, event_id, duration, DATE(startdate)-CURRENT_DATETIME AS days FROM main_cityevent WHERE DATE(startdate) <= DATE(NOW())

有关 postgres 日期/时间函数的完整说明,请参见此处

在相关的说明中,为什么需要在查询中强制转换"开始日期"?是将其存储为字符串、时间戳还是其他内容?如果是日期,则应将其视为日期。类型在RDBMS中对于正确性和性能很重要。您可以(至少)通过减去日期和日期时间来出现逐一错误。

正如 DiggyF 所暗示的,你应该使用

diff = datetime.now() - sd

在上面的代码中,名为 diffdatetime.timedelta对象将具有微秒分辨率。 除非您打算使用微秒级分辨率,否则处理生成的timedelta可能比执行此操作更难

from datetime import date
tmp = startdate.split('-')
sd = date(int(tmp[0]), int(tmp[1]), int(tmp[2]))
diff = date.today() - sd

这产生了具有日分辨率的datetime.timedelta...

相关内容

  • 没有找到相关文章

最新更新