python: нужна помощь для правильной реализации strptime ()

1

Я пытаюсь найти разницу в днях между текущей датой и датой, которую я извлекаю из базы данных (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.

Что я делаю неправильно?

  • 1
    Вы делали from datetime import datetime или import datetime ?
  • 0
    да из даты и времени
Теги:
datetime
date
time

2 ответа

3
Лучший ответ

Вероятно, вы импортируете 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" внутри запроса? Сохраняете ли вы его как строку или временную метку или что-то другое? Если это дата, ее следует рассматривать как таковую. Типы важны в РСУБД, для правильности и производительности. Вы можете (по крайней мере) иметь ошибки "один за другим", вычитая даты и даты.

  • 0
    спасибо проверим ваши слова и вернусь. 'startdate' - это поле метки времени. Вот почему я конвертирую это в дату.
  • 0
    CURRENT_DATETIME выдавал мне ошибку, поэтому я попробовал это, и это сработало: SELECT id, city_id, event_id, duration, DATE (CURRENT_TIMESTAMP) -DATE (startdate) AS дней FROM main_cityevent WHERE DATE (startdate) <= DATE (NOW ())
Показать ещё 1 комментарий
1

Как указано в 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 с разрешением дня...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню