LINUX.ORG.RU

сравнение даты на python


0

1

вобщем есть поле в бд, там datetime а я хочу сравнить его с реальной датой и если она (год,месяц, день) совпадает делать действия , как сравнить датетайм с датой?


Вот уеб-девелопмент уже давно отделили от нормальной разработки.

Когда уже тупых пистонеров отсадят?

anonymous
()
Ответ на: комментарий от megido

Тип DateTime преобразовывается в datetime.date, т.е. сравнивать нужно с datetime.date.today()

AlexKiriukha ★★★★
()
Ответ на: комментарий от megido

я спросил как и можна ли вобще

под фильтр ниче не попадает

Умник, такой умник, ага.

baverman ★★★
()
Ответ на: комментарий от megido

> ты идиот,

На пятом цикле потуг сравнить datetime vs date это заявление выглядит особенно пикантно. ;)

LamerOk ★★★★★
()

Может проще в БД хранить unix-timestamp как INT UNSIGNED? А в Пистоне как-нибудь:

import time 
time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(epoch)) 

(Replace time.localtime with time.gmtime for GMT time.)
?

kovrik ★★★★★
()
Ответ на: комментарий от megido
start_date = datetime.date(2011, 6, 30)
end_date = datetime.date(2011, 6, 30)
msgs=Message.objects.filter(date__gt=datetime.date(2011, 6, 30))

вот так работает

megido
() автор топика
Ответ на: комментарий от megido

эээ рано радуюсь, теперь фильтр так, для прикола, в выборку попал 2015 год

megido
() автор топика
Ответ на: комментарий от megido
start_date = datetime.date(2011, 6, 30)
end_date = datetime.date(2012, 6, 30)
msgs=Message.objects.filter(date__range=(start_date,end_date))

вот так точно работает, но как же настроить range считать включительно?

megido
() автор топика
Ответ на: комментарий от megido

> msgs=Message.objects.filter(date=datetime.datetime.today().date)

У тебя поле «date» (тот, что перед знаком равенства) имеет тип datetime, и тебе нужно отфильтровать один день, или, как ты выразился, сравнить с реальной датой (то есть типом date).
Представь себе, что вместо datetime у тебя действительные числа в БД, например, {1.4142, 2.7182, 3.0, 3.1415}. И ты хочешь выбрать все числа, у которых целая часть равна некоторому целому числу, к примеру, 3.

И тут есть два очевидных решения.
Первое. Ты можешь приводить каждое действительное число из БД к целому, отбрасывая дробную часть, и сравнивать с заданным целым числом ([1.4141] == 3, [2.7182] == 3, ...).
Но такое решение не подходит под твое API, так как ты не можешь ничего сделать с полем date (типа datetime ака «действительное») перед тем, как сравнивать с заданным числом, либо можешь, но не знаешь как (я тоже не знаю, for all I care, джанговский filter() составляет SQL запрос, то есть никаких значений у тебя еще нет на данный момент в питоне, а соответственно и преобразовывать из одного типа в другой пока еще нечего, а в таком случае тебе доступны только SQL функции, среди которых может оказаться и нужная: DATETIME => DATE).

Второе решение тебе уже предложили выше. Выбирать по диапазону (3 <= x < 3 + 1 = 4). Я понятия не имею, как реализовано сравнение по диапазону (если я прав, то реализация зависит от конкретной БД), но почему-то мне кажется, что это должно работать быстрее, чем первый вариант (если он вообще возможен).

Что же ты делаешь (в моей аналогии)? Ты берешь некоторое действительное число (datetime.today()), отбрасываешь его дробную часть (используя метод date()), после чего сравниваешь каждое действительное число из БД с тем целым числом, которое у тебя получилось (1.4141 == [3.5], 2.7182 == [3.5], ...). Естественно, это не то, что ты хочешь получить.

anonymous
()
Ответ на: комментарий от anonymous

по диапазону работает,но я пока не понял как ним отфильтровать данные за 1 день

megido
() автор топика
Ответ на: комментарий от megido

> вот так точно работает, но как же настроить range считать включительно?

Range test (inclusive).

inclusive



.<

anonymous
()
Ответ на: комментарий от megido

остался один вопрос: как в датетфйм дату подставить? :D

megido
() автор топика
Ответ на: комментарий от megido

теперь еще напиши чтоб это работало в произвольный день. (не забудь потом на говнокод выложить, я уверен будет замечательный экземпляр).

provaton ★★★★★
()
Ответ на: комментарий от megido

вот жеж ты гаденыш, тут люди за тебя твою работу делают, а ты им хамишь в ответ.

provaton ★★★★★
()
Ответ на: комментарий от megido

Ну этот код работает только 30-го июня. А что будет 5-го ноября? 28-го февраля? Каждый день будешь руками править?

provaton ★★★★★
()
Ответ на: комментарий от megido

но как же настроить range считать включительно?

Ты не поверишь, мой близкий друг.

baverman ★★★
()
Ответ на: комментарий от megido

[code=python] start_date = datetime.datetime.today() - timedelta(days=1) end_date = datetime.datetime.today() msgs=Message.objects.filter(date__range=(start_date,end_date)) [/code]

вот так вроди робит

megido
() автор топика
Ответ на: комментарий от megido

start_date = datetime.datetime.today() - timedelta(days=1) end_date = datetime.datetime.today()

Вообще, в случае datetime, а не date, тебе надо не совсем это, а 0 часов 0 минут предыдущего дня и 23:59:59 следуюшего. Чтобы получить весь диапазон. Например:

start_date = datetime.datetime.combine(datetime.datetime.today() - datetime.timedelta(days=1), datetime.time.min)

end_date = datetime.datetime.combine(datetime.datetime.today(), datetime.time.max)

И лучше сначала питон изучи, а потом джангу мучай.

anonymous
()
Ответ на: комментарий от anonymous

питон я и так знаю, просто никогда с датой работать не приходилось

megido
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.