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

时间:2011-05-07 15:15:19

标签: python datetime date time

我试图找出当前日期和我从数据库中提取的日期之间的天数差异(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。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

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

通过始终导入datetime模块,您可以同时使用datetime.datetimedatetime.date,这在您的情况下更合适,并且具有良好的.today()方法。< / p>

你不需要整个str() - &gt; strptime()之旅,因为它应该已经是一个python日期对象。

此外,您可以减去查询中的日期并获得天数差异:

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日期/时间函数的完整说明,请参阅here

在相关的说明中,为什么需要在查询中投射'startdate'?将它存储为字符串,时间戳或不同的东西?如果是日期,则应视为日期。对于正确性和性能,类型在RDBMS中很重要。您可以(至少)通过减去日期和日期时间来获得一个错误。

答案 1 :(得分:1)

正如DiggyF所提到的,你应该使用

diff = datetime.now() - sd

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

timedelta

这会产生from datetime import date tmp = startdate.split('-') sd = date(int(tmp[0]), int(tmp[1]), int(tmp[2])) diff = date.today() - sd 日分辨率......