Oracle 下周日在甲骨文

Oracle 下周日在甲骨文,oracle,Oracle,我想在查询中获取所提供的datebind变量的下一个星期天。所以我写了如下 SELECT NEXT_DAY(NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999'),'SUN') FROM DUAL 这适用于所有日期,除非当天本身是星期日。如果这一天本身就是星期天,那么它不应该给出下一个星期天,而是应该在同一天返回。在讨论答案之前,我想谈谈您的方法的两个依赖性 首先-取决于默认的日期格式 NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DE

我想在查询中获取所提供的datebind变量的下一个星期天。所以我写了如下

SELECT NEXT_DAY(NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999'),'SUN') FROM DUAL

这适用于所有日期,除非当天本身是星期日。如果这一天本身就是星期天,那么它不应该给出下一个星期天,而是应该在同一天返回。

在讨论答案之前,我想谈谈您的方法的两个依赖性

首先-取决于默认的日期格式

 NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999')
NVL的第一个参数是date,第二个参数是要转换为date的字符串

其次,在查询中使用“SUN”取决于NLS设置。如果客户端具有不同的NLS_语言设置,则查询将失败。试一试

ALTER SESSION SET NLS_LANGUAGE= 'GERMAN';
此公式以NLS独立方式返回下一个星期日:

解释

trunc(my_date) - trunc(my_date,'IW') 
返回一个介于0和6之间的数字。周一零到周日六点

 6 - (trunc(my_date) - trunc(my_date,'IW'))  
返回一个介于6和0之间的数字。星期一六到星期天零。这意味着这是到下个星期天的天数。只需将其添加到日期参数,它将返回下一个星期天。对于星期天,您添加零,即,正如预期的那样,您得到的是同一天

试验

要使用WHERE子句中的表达式,请使用包含参数date的一行的子查询分解,并将其交叉联接到表中:

with my_date as (SELECT TO_DATE(NVL(:1, '31-DEC-9999'), 'DD-MON-YYYY') my_date FROM   dual)
select * from my_tab d cross join my_date 
where D.CAL_DATE <= my_date + 6 - (trunc(my_date) - trunc(my_date,'IW'));

在讨论答案之前,我想讨论一下您的方法的两个依赖性

首先-取决于默认的日期格式

 NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999')
NVL的第一个参数是date,第二个参数是要转换为date的字符串

其次,在查询中使用“SUN”取决于NLS设置。如果客户端具有不同的NLS_语言设置,则查询将失败。试一试

ALTER SESSION SET NLS_LANGUAGE= 'GERMAN';
此公式以NLS独立方式返回下一个星期日:

解释

trunc(my_date) - trunc(my_date,'IW') 
返回一个介于0和6之间的数字。周一零到周日六点

 6 - (trunc(my_date) - trunc(my_date,'IW'))  
返回一个介于6和0之间的数字。星期一六到星期天零。这意味着这是到下个星期天的天数。只需将其添加到日期参数,它将返回下一个星期天。对于星期天,您添加零,即,正如预期的那样,您得到的是同一天

试验

要使用WHERE子句中的表达式,请使用包含参数date的一行的子查询分解,并将其交叉联接到表中:

with my_date as (SELECT TO_DATE(NVL(:1, '31-DEC-9999'), 'DD-MON-YYYY') my_date FROM   dual)
select * from my_tab d cross join my_date 
where D.CAL_DATE <= my_date + 6 - (trunc(my_date) - trunc(my_date,'IW'));
只需使用CASE语句进行比较

SELECT CASE
         WHEN TRIM(TO_CHAR(dt, 'DAY')) = 'SUNDAY' THEN dt
         ELSE NEXT_DAY(dt, 'SUN')
       END sunday
FROM   (SELECT NVL(TO_DATE(:1, 'DD-MON-YYYY'), '31-DEC-9999') dt
        FROM   dual);  
只需使用CASE语句进行比较

SELECT CASE
         WHEN TRIM(TO_CHAR(dt, 'DAY')) = 'SUNDAY' THEN dt
         ELSE NEXT_DAY(dt, 'SUN')
       END sunday
FROM   (SELECT NVL(TO_DATE(:1, 'DD-MON-YYYY'), '31-DEC-9999') dt
        FROM   dual);  

只需从日期中减去1天,然后使用下一天:


只需从日期中减去1天,然后使用下一天:


我在where条件下使用它。代码的一部分:Where TO_DATED.CAL_DATE我在Where子句中添加了用法,HTH。我在Where条件下使用它。代码的一部分:Where TO_DATED.CAL_DATE我在Where子句中添加了用法,HTH。