我想获得提供日期的下一个星期日(在我的查询中绑定变量)。所以我写了如下。
HalFull
这适用于所有日期,除非当天是星期天。如果这一天是星期日本身,它不应该在下周日给出,而应该在同一天返回。
答案 0 :(得分:2)
只需使用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)
从您的约会中减去1天,然后使用NEXT_DAY
:
SELECT NEXT_DAY(
NVL(
TO_DATE( :1, 'DD-MON-YYYY' ) - INTERVAL '1' DAY,
DATE '9999-12-31' -- Use a date literal
),
'SUN'
)
FROM DUAL
答案 2 :(得分:0)
在讨论答案之前,我想解决你的方法的两个依赖关系。
首先 - 您依赖于默认的DATE格式
NVL(TO_DATE(:1,'DD-MON-YYYY'),'31-DEC-9999')
NVL的第一个参数是date,第二个是要转换为DATE的String
第二次使用' SUN'在查询中取决于NLS设置。如果客户端具有不同的NLS_LANGUAGE
设置,则查询将失败。试试
ALTER SESSION SET NLS_LANGUAGE= 'GERMAN';
此公式以NLS独立方式返回下周日:
my_date + 6 - (trunc(my_date) - trunc(my_date,'IW'))
解释
trunc(my_date) - trunc(my_date,'IW')
返回0到6之间的数字。周一为零,周日为6。
6 - (trunc(my_date) - trunc(my_date,'IW'))
返回6到0之间的数字。星期一为6,星期日为零。这意味着这是直到下个星期天的天数。简单地将它添加到您的日期参数它将返回下一个星期日。 (对于星期日,你加零,即按预期你得到同一天。)
<强>测试强>
with my_dates as (
select TO_DATE('28-10-2017','DD-MM-YYYY') + rownum -1 my_date from DUAL connect by level <= 10 )
select my_date, trunc(my_date) - trunc(my_date,'IW') day_of_week,
6 - (trunc(my_date) - trunc(my_date,'IW')) days_to_next_sunday,
-- next sunday formula
my_date + 6 - (trunc(my_date) - trunc(my_date,'IW')) next_sunday
from my_dates;
MY_DATE DAY_OF_WEEK DAYS_TO_NEXT_SUNDAY NEXT_SUNDAY
--------- ----------- ------------------- -----------
28-OCT-17 5 1 29-OCT-17
29-OCT-17 6 0 29-OCT-17
30-OCT-17 0 6 05-NOV-17
31-OCT-17 1 5 05-NOV-17
01-NOV-17 2 4 05-NOV-17
02-NOV-17 3 3 05-NOV-17
03-NOV-17 4 2 05-NOV-17
04-NOV-17 5 1 05-NOV-17
05-NOV-17 6 0 05-NOV-17
06-NOV-17 0 6 12-NOV-17
所以你的查询如下
SELECT
my_date + 6 - (trunc(my_date) - trunc(my_date,'IW')) next_sunday
FROM (SELECT TO_DATE(NVL(:1, '31-DEC-9999'), 'DD-MON-YYYY') my_date
FROM dual);
要使用WHERE
子句中的表达式,只需使用包含参数日期的一行子查询,并将其交叉连接到表中:
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'));