python: нужна помощь для правильной реализации strptime () - PullRequest
1 голос
/ 07 мая 2011

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

3 голосов
/ 07 мая 2011

Вы, вероятно, импортируете datetime.datetime (класс) вместо datetime (модуль).

Всегда импортируя модуль datetime, вы можете использовать как datetime.datetime, так и datetime.date, что больше подходит для вашего случая и имеет хороший метод .today().

И вам не нужна вся поездка str () -> 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 см. здесь

В связанной заметке, зачем вам приводить 'startdate' внутри запроса? Храните это как строку, или метку времени, или как-то иначе? Если это свидание, оно должно рассматриваться как таковое. Типы важны в RDBMS, для правильности и производительности. Вы можете (по крайней мере) иметь ошибки по одному, вычитая даты и даты.

1 голос
/ 07 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...