如何获得一个月的天数?

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()为任何其他日期.

  • 我会用''1天':: interval替换第二个`DATE_TRUNC('month',NOW())` (10认同)
  • @ sayap的纠正至关重要; 解决方案可能导致不良结果(尝试,例如,`'2006-04-30':: date`)代替`NOW()` (2认同)
  • @icemtel:`'2020-12-01'::日期` (2认同)

Erw*_*ter 5

正如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(可能是带符号的);unitmicrosecondmillisecondsecondminutehourdayweekmonthyeardecadecenturymillennium,或缩写或这些单元的复数;

也接受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)

都一样。