我试图找出当前日期和我从数据库中提取的日期之间的天数差异(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。
我做错了什么?
答案 0 :(得分:3)
您可能正在导入datetime.datetime
(该类)而不是datetime
(模块)。
通过始终导入datetime
模块,您可以同时使用datetime.datetime
和datetime.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
日分辨率......