Oracle 下周日在甲骨文
我想在查询中获取所提供的datebind变量的下一个星期天。所以我写了如下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
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。