[英]Date calculation not working in Oracle SQL Case Statement?
我试图将数据集的一周的开始从星期一更改为上一个星期五。 总体数据将汇总到一周的水平,如下所示。
星期五,星期六,星期日,星期一,星期二,星期三,星期四
为此,我想出的最好的方法是将个案设置为周五,周六和周日为下周的第一天(系统的第一天为周一,最后一天为周日)。
SELECT TRANSACTIONDATE,
CASE
WHEN TO_CHAR(TRANSACTIONDATE, 'DAY') IN ('FRIDAY', 'SATURDAY',
'SUNDAY') THEN (TRUNC(TRANSACTIONDATE, 'IW')+7)
ELSE TRUNC(TRANSACTIONDATE, 'IW')
END AS TEST
FROM TRANSACTIONS
我的代码逻辑是:如果Fri,Sat或Sun,则找到一周的第一天,并在下周的第一天加上7。
问题在于,语句“ TRUNC(TRANSACTIONDATE,'IW')+ 7”没有将7天添加到一周的开始。
当我查询
select "TRUNC(TRANSACTIONDATE, 'IW')+7" from transactions
我可以在下个星期开始,这是正确的。
这样,从星期五到星期四的所有日子都在同一周数之内。
任何想法出了什么问题,或者是否有更好的方法来实现我的目标?
谢谢汤姆
编辑**
我想要达到的第一个数据集是
Date Day Week
4/1/2018 Monday 1
4/2/2018 Tuesday 1
4/3/2018 Wednesday 1
4/4/2018 Thursday 1
4/5/2018 Friday 2
4/6/2018 Saturday 2
4/7/2018 Sunday 2
4/8/2018 Monday 2
4/9/2018 Tuesday 2
4/10/2018 Wednesday 2
4/11/2018 Thursday 2
因此,在上方您可以看到我希望周五/周六/周日落入下一周。
这是当前系统的日期/星期,
Date Day Week
4/1/2018 Monday 1
4/2/2018 Tuesday 1
4/3/2018 Wednesday 1
4/4/2018 Thursday 1
4/5/2018 Friday 1
4/6/2018 Saturday 1
4/7/2018 Sunday 1
4/8/2018 Monday 2
4/9/2018 Tuesday 2
问题是TO_CHAR(TRANSACTIONDATE, 'DAY')
当您使用'DAY'
则用空格字符填充工作日名称。 尝试SELECT '<'||TO_CHAR(DATE '2018-05-07', 'DAY')||'>' from dual;
看效果。
函数TO_CHAR(..., 'DAY')
根据当前用户会话NLS_DATE_LANGUAGE
设置返回工作日名称。 可能不是英文。
例如,将表达式更改为
TO_CHAR(TRANSACTIONDATE, 'fmDAY', 'NLS_DATE_LANGUAGE=american') IN ('FRIDAY', 'SATURDAY', 'SUNDAY')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.