Я пытаюсь определить количество дней между двумя разными датами, кроме выходных.
Я не знаю, как этого добиться.
postgresql
datetime
Pragati Basa
источник
источник
Ответы:
Предполагая, что под «выходными» вы подразумеваете субботу и воскресенье , это может быть еще проще:
Вам не нужен дополнительный уровень подзапроса для
generate_series()
. SRF (набор возвращающих функций), также называемый «табличными функциями», может использоваться точно так же, как таблицы вFROM
предложении.В частности, обратите внимание, что
generate_series()
включает верхнюю границу в выходных данных, если подходит полный интервал (3-й параметр). Верхняя граница исключается только в том случае, если последний интервал будет усеченным, что не относится к полным дням.В соответствии с шаблоном
ISODOW
EXTRACT () , воскресенья представляются в7
соответствии со стандартом ISO. Позволяет для более простогоWHERE
условия.Скорее звоните
generate_series()
сtimestamp
вводом. Вот почему:count(*)
немного короче и быстрее чемcount(the_day)
, делая то же самое в этом случае.Чтобы исключить нижнюю и / или верхнюю границу, добавьте / вычтите 1 день соответственно. Как правило, вы можете включить нижнюю и исключить верхнюю границу:
источник
В этом примере перечислены все даты между 2013-12-15 и 2014-01-02 (включительно). Во втором столбце указан день недели (численно от 0 до 6). В третьем столбце указано, является ли день недели субботой / воскресеньем или нет (вам придется адаптировать то, что вы считаете выходными), и это то, что можно использовать для подсчета дней недели.
источник
Предполагая, что выходные - это суббота и воскресенье, вы можете использовать следующий SQL.
Замените даты вашим выбором, а (0,6) - днями недели, которые вы хотите исключить.
Несколько вещей, которые вы должны принять к сведению: -
Вы не упомянули, какую версию PostgreSQL вы используете. Это работает на 9.1+, но должно работать на более низких версиях.
Выбранные даты включаются при использовании generate_series. Так что, если вы хотите промежуточные дни, добавьте 1 день к каждой дате.
источник
Есть несколько вещей, которые вы можете сделать, чтобы сделать это проще. Метод, который я бы использовал, был бы для проверки наличия таблицы дат. Вы можете быстро создать такой как:
Как только таблица будет создана, вы сможете сравнительно быстро заполнить ее данными о дате.
Затем вы можете написать свой запрос в виде быстрого подсчета записей из этой таблицы.
источник
Я предлагаю вам создать функцию для использования в любое время и писать меньше; )
Этот код выше создаст функцию sql, которая считает и возвращает количество выходных дней (сб, вс). Просто у вас будет больше возможностей использовать эту функцию.
После этого вы можете использовать функцию для возврата только количества выходных дней в интервале. Вот пример для использования:
Этот выбор должен вернуть четыре, потому что первый и второй день - понедельник, и у нас есть 2 субботы и 2 воскресенья между ними.
Теперь, чтобы вернуть только рабочие дни (без выходных), как вы хотите , просто сделайте вычитание, как в примере ниже:
источник
источник