2015-04-13 2 views
1

В моей таблице есть два столбца, в которых хранятся дни, с которых начинаются и заканчиваются конкретные сделки. Значения этих столбцов являются ints и следуют одному и тому же шаблону библиотеки datetime, которую использует Python.Сравнение дневных диапазонов с Django

В настоящее время моя логика работает для дневных диапазонов, которые не обтекают неделю, т.е. Понедельник-пятница, четверг-суббота, вторник-четверг и т. Д. Я не уверен, как поймать сделки, которые попадают на следующую неделю, такие как пятница-понедельник, суббота-вторник и т. Д. Вот мое заявление с использованием Django:

Deal.objects.filter(Q(deal_day_start__lte=current_day) & Q(deal_day_end__gte=current_day)) 

Очевидно, что это дает мне проблемы для диапазонов пятница - понедельник, поскольку текущий день, например, может быть воскресным, а это 0 в день и день начала сделки - 5 для пятницы.

Есть ли простой способ решить эту проблему с помощью Django? Если бы я использовал инструкции Python if else, я мог бы создать несколько ветвей и захватить этот сценарий, но я не уверен, как это сделать с помощью Django.

+1

int, представляющий только будний день, является ужасной идеей ... переосмыслить схему базы данных ... –

+0

@JoranBeasley Не стоит беспокоиться. Достаточно рано в проекте, чтобы я мог его изменить. Как вы рекомендуете хранить дни в неделю и использовать их для сравнения? – farbodg

+0

просто сохраните отметку времени начала дня и даты окончания ... таким образом, у вас есть вся информация –

ответ

2

Учитывая используемую схему я бы предложил:

Deal.objects.filter(
    Q(deal_day_start__lte=current_day, deal_day_end__gte=current_day) | 
    Q(deal_day_start__lte=current_day, deal_day_end__lt=F("deal_day_start")) | 
    Q(deal_day_start__gte=current_day, deal_day_end__gte=current_day, deal_day_end__lt=F("deal_day_start")) 
) 

Давайте сделать замечание, что для сделки, чтобы обернуть конец день должен быть меньше стартового дня. У нас есть 3 случая, когда текущий день относится к периоду сделки:

  • Если текущий день находится между начальным и конечным днем.
  • Если текущий день больше, чем начальный день, но больше, чем в конце дня, то это означает, что сделка должна быть завершена.
  • Если текущий день меньше даты начала, сделка должна быть завершена. Но не только обертывание, но и завершение после текущего дня.
+0

Комментарии не предназначены для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/75228/discussion-on-answer-by-juniorcompressor-comparing-day-ranges-with-django). – Taryn

+0

@foadster я добавил описание. – JuniorCompressor

+0

@JuniorCompressor Спасибо! – farbodg

Смежные вопросы