Oracle SQL在上周日发布

Oracle SQL在上周日发布,sql,oracle,Sql,Oracle,我目前正在使用下面的语句成功地获取它 SELECT next_day(sysdate-7, 'Sunday') FROM dual; 有没有更优雅的方法?如果我尝试使用last_day,它会给出一个错误。如果您对NLS会话参数感到不舒服,这是下一天函数所必需的,您可以使用函数:将日期截断为ISO周,从周一开始,减去一天到周日 但请记住,Oracle的日期本质上是一个日期和时间,trunc函数将所有较低粒度的日期元素(低于截断单位)设置为初始值,因此您将到达前一个星期天的午夜。相

我目前正在使用下面的语句成功地获取它

SELECT
    next_day(sysdate-7, 'Sunday')
FROM
    dual;

有没有更优雅的方法?如果我尝试使用last_day,它会给出一个错误。

如果您对NLS会话参数感到不舒服,这是
下一天
函数所必需的,您可以使用函数:将日期截断为ISO周,从周一开始,减去一天到周日

但请记住,Oracle的日期本质上是一个日期和时间,
trunc
函数将所有较低粒度的日期元素(低于截断单位)设置为初始值,因此您将到达前一个星期天的午夜。相比之下,
next_-day
保留时间部分,因此使用
next_-day
trunc
检索的两个日期将完全不相等

如果需要保持相同的结果,但没有NLS依赖项,则可以执行一些间隔计算,这将保留时间部分

有关日期和时间格式元素的更多信息,请参见

以下是所有上述解决方案的比较:

DT|TRUNC | DT|u下一天| DT|u间隔 :------------------ | :------------------ | :------------------ 2021-04-18 00:00:00 | 2021-04-18 18:02:42 | 2021-04-18 18:02:42
dbfiddle在我看来还不错。这个看起来很优雅。请尝试在SQL Server中执行此操作<代码>最后一天返回当月的最后一天。上面的代码有什么问题吗?
trunc(sysdste,'IW')-1
:没有NLSparameters@JaviTorre最好在文档中检查和描述函数。它截短(
trunc
)ISO周开始(
IW
)(从周一开始)的日期,并取上一个(
-1
)天(周日)。
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'
select
  --IW here stands for ISO week
  trunc(sysdate, 'IW') - 1 as dt_trunc,
  next_day(sysdate - 7, 'Sunday') as dt_next_day,
  --double quoted part in date format is needed to embed string constants in the format
  sysdate - to_dsinterval(to_char(sysdate, 'D "00:00:00"')) + 1 as dt_interval
from dual
DT_TRUNC | DT_NEXT_DAY | DT_INTERVAL :------------------ | :------------------ | :------------------ 2021-04-18 00:00:00 | 2021-04-18 18:02:42 | 2021-04-18 18:02:42