Использование умного «трюка» для извлечения части day из последней даты месяца, как , продемонстрированное Quassnoi .Но это может быть немного проще / быстрее:
SELECT extract(days FROM date_trunc('month', now()) + interval '1 month - 1 day');
Обоснование
extract
- это стандартный SQL, поэтому может быть предпочтительнее, но внутренне разрешает ту же функцию, что и date_part()
. Руководство:
Функция date_part
смоделирована на традиционном Ingres, эквивалентном стандартной функции SQL extract
:
Нонам нужно только добавить a single interval
.Postgres позволяет использовать несколько единиц времени одновременно. Руководство:
interval
значения могут быть записаны с использованием следующего подробного синтаксиса:
[@]
quantity unit
[
quantity unit
...] [
direction
]
где quantity
- число (возможно, подписанное);unit
- microsecond
, millisecond
, second
, minute
, hour
, day
, week
, month
, year
, decade
,century
, millennium
, или сокращения или множественные числа этих единиц;
ISO 8601 или стандартный формат SQL также принимаются.В любом случае, снова руководство :
Внутренне interval
значения сохраняются в месяцах, днях и секундах.Это сделано потому, что число дней в месяце варьируется, и день может иметь 23 или 25 часов, если речь идет о переходе на летнее время.Поля месяцев и дней являются целыми числами, а в поле секунд можно хранить дроби.
(Вывод / отображение зависит от значения IntervalStyle
.)
В приведенном выше примере используется формат Postgres по умолчанию : interval '1 month - 1 day'
.Они также действительны (хотя и менее читаемы):
interval '1 mon - 1 d' -- unambiguous abbreviations of time units are allowed
Формат IS0 8601 :
interval '0-1 -1 0:0'
Стандартный формат SQL :
interval 'P1M-1D';
Все то же самое.