mmr*_*151 20 postgresql datetime date-arithmetic
我想在Postgres中获得以下内容:
select day_in_month(2);
Run Code Online (Sandbox Code Playgroud)
预期产量:
28
Run Code Online (Sandbox Code Playgroud)
Postgres有没有内置的方法来做到这一点?
Qua*_*noi 34
SELECT
DATE_PART('days',
DATE_TRUNC('month', NOW())
+ '1 MONTH'::INTERVAL
- '1 DAY'::INTERVAL
)
Run Code Online (Sandbox Code Playgroud)
替换NOW()
为任何其他日期.
正如Quassnoi所展示的,使用智能“技巧” 从该月的最后一个日期提取日部分。但这可能会更简单/更快:
SELECT extract(days FROM date_trunc('month', now()) + interval '1 month - 1 day');
Run Code Online (Sandbox Code Playgroud)
extract
是标准SQL,因此可能更可取,但它内部解析为与相同的函数date_part()
。手册:
该
date_part
函数以与SQL标准函数等效的传统Ingres建模extract
:
但是,我们只需要添加一个单一的 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
Run Code Online (Sandbox Code Playgroud)
IS0 8601格式:
interval '0-1 -1 0:0'
Run Code Online (Sandbox Code Playgroud)
标准SQL格式:
interval 'P1M-1D';
Run Code Online (Sandbox Code Playgroud)
都一样。