Я пытаюсь найти разницу в днях между текущей датой и датой, которую я извлекаю из базы данных (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() trip, так как она уже должна быть объектом даты 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 см. здесь здесь
В соответствующей заметке, зачем вам нужно вводить "startdate" внутри запроса? Сохраняете ли вы его как строку или временную метку или что-то другое? Если это дата, ее следует рассматривать как таковую. Типы важны в РСУБД, для правильности и производительности. Вы можете (по крайней мере) иметь ошибки "один за другим", вычитая даты и даты.
Как указано в DiggyF, вы должны использовать
diff = datetime.now() - sd
В приведенном выше коде объект datetime.timedelta
с именем diff
будет иметь разрешение в микросекундах. Если вы не настроили разрешение на микросекунду, обработка результирующего 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
с разрешением дня...
from datetime import datetime
илиimport datetime
?