Oracle - LAST_DAY 和 TRUNC - 执行顺序

Posted

技术标签:

【中文标题】Oracle - LAST_DAY 和 TRUNC - 执行顺序【英文标题】:Oracle - LAST_DAY and TRUNC - order of execution 【发布时间】:2021-10-02 06:56:24 【问题描述】:

使用LAST_DAYTRUNC 的组合时,我得到了意想不到的结果:

select LAST_DAY(TRUNC(sysdate, 'DAY')) from dual;
--31-JUL-2021 00:00:00

select TRUNC(LAST_DAY(sysdate), 'DAY')from dual;
--26-JUL-2021 00:00:00

为什么这些调用不会返回相同的结果?我的意思是,有什么区别:

    我希望今天被截断(摆脱小时数) 然后获取该月的最后一天

    我想要一个月的最后一天(带小时) 然后去掉小时部分

【问题讨论】:

只是为了备份已经给出的答案; documentation shows the behaviour 用于不同的格式元素。它还指出“DAY”是 NLS 敏感的。 【参考方案1】:

TRUNC(datestamp, 'DAY') 获取包含datestamp 的一周的第一天。奇怪但真实。

如果您想要日期戳的日期,只需使用TRUNC(datestamp)

Oracle 日期戳实际上是浮点数。

【讨论】:

哦,天哪,您对“DAY”部分的看法是绝对正确的:D“DD”是我一直在寻找的……完全错过了。谢谢! @O.琼斯。轻微修正。 Oracle 日期(时间戳)不是浮点数,而是整数的内部字节数组(日期为 7 个字节,时间戳为 11-13 个字节)。 See。您可以瞥见这个正在运行的select sysdate, dump(sysdate) from dual; 日期 算术 与浮点算术一起使用是正确的,因为 1 表示一天,因此半天是 0.5 和四分之一一天为 0.25 等。

以上是关于Oracle - LAST_DAY 和 TRUNC - 执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

oracle 日期常用函数 (ADD_MONTHS,LAST_DAY,NEXT_DAY,MONTHS_BETWEEN,NEW_TIME,ROUND,TRUNC)

oracle获取本月第一天和最后一天及Oracle trunc()函数的用法

Oracle之job 常用定时时间

oracle定时任务(dbms_job)的时间设置参考

oracle本月上月去年

sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天