我正在尝试查找当前日期和从数据库中提取的日期之间的天数差异(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.datetime
和 datetime.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
在上面的代码中,名为 diff
的datetime.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
...