Oracle中trunc(SYSDATE)取当前日期,PostgreSQL是否支持及替代方案?
Oracle语句
select trunc(SYSDATE) from dual;在PostgreSQL中的可行性 这条语句无法直接在PostgreSQL中运行,原因有两点:
- PostgreSQL不存在
dual虚拟表:PostgreSQL支持直接执行无FROM子句的单行查询,不需要依赖这类虚拟表返回单行结果; - 尽管PostgreSQL兼容
SYSDATE(作为CURRENT_TIMESTAMP的别名),但原语句会因dual表不存在抛出错误。
PostgreSQL的替代实现方案
要达到Oracle中trunc(SYSDATE)获取当前纯日期(仅保留年月日、去除时分秒)的效果,有以下几种常用方法:
方法1:直接使用CURRENT_DATE
这是最简洁的方式,CURRENT_DATE是PostgreSQL标准内置函数,直接返回无时分秒的日期类型值:
SELECT CURRENT_DATE;
方法2:用trunc()截断时间戳
如果基于时间戳(比如CURRENT_TIMESTAMP)截断到日期部分,可使用trunc()函数,默认行为就是截断到天:
SELECT trunc(CURRENT_TIMESTAMP);
也可以显式指定截断单位为'day',效果完全一致:
SELECT trunc(CURRENT_TIMESTAMP, 'day');
方法3:使用DATE_TRUNC()函数(更灵活)
DATE_TRUNC()是PostgreSQL功能更丰富的日期截断函数,支持截断到年、月、日、小时等多种粒度。截断到天的写法如下:
SELECT date_trunc('day', CURRENT_TIMESTAMP);
注:DATE_TRUNC()返回timestamp类型(会显示00:00:00的时分秒),若需转为纯date类型,可添加类型转换:
SELECT date_trunc('day', CURRENT_TIMESTAMP)::date;
内容的提问来源于stack exchange,提问作者Joker221
相关产品推荐
相关产品推荐

