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)
都一样。
| 归档时间: |
|
| 查看次数: |
19214 次 |
| 最近记录: |