我遇到了以下SQL查询:
SELECT
CASE
WHEN WEEK >= TO_CHAR(TRUNC(to_date('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-7,'D')+4,'IYYY-IW')
THEN TRUNC(DISCONNECT_DATE_DATETIME)
ELSE TRUNC(DISCONNECT_DATE_DATETIME,'D') END AS DAY
from some_Table
有人可以在上面的查询中解释一下“trunc”函数的用法,因为我无法理解它。
由于
答案 0 :(得分:1)
to_date('{RUN_DATE_YYYYMMDD}','YYYYMMDD')
会将您的字符串转换为DATE
数据类型。date_value - 7
从该日期开始减去7天。TRUNC( date_value, 'D' )
会将日期值截断为一周中第一天的午夜(由NLS_TERRITORY
会话参数确定)。date_value + 4
添加了4天的日期。TO_CHAR( date_value, 'IYYY-IW' )
根据ISO标准将日期转换为:4位数年份;然后是基于ISO标准的一周(1-52或1-53)。查看NLS_TERRITORY
:
ALTER SESSION SET NLS_TERRITORY = 'America';
SELECT dt,
TO_CHAR(TRUNC(dt-7,'D')+4,'IYYY-IW') as dt1,
TO_CHAR(dt-7,'IYYY-IW') AS dt2
FROM ( SELECT (SYSDATE + LEVEL - 1) AS dt FROM DUAL CONNECT BY LEVEL <= 7 );
ALTER SESSION SET NLS_TERRITORY = 'France';
SELECT dt,
TO_CHAR(TRUNC(dt-7,'D')+4,'IYYY-IW') AS dt1,
TO_CHAR(dt-7,'IYYY-IW') AS dt2
FROM ( SELECT (SYSDATE + LEVEL - 1) AS dt FROM DUAL CONNECT BY LEVEL <= 7 );
输出:
Session altered.
DT DT1 DT2
--------- ------- -------
05-APR-17 2017-13 2017-13
06-APR-17 2017-13 2017-13
07-APR-17 2017-13 2017-13
08-APR-17 2017-13 2017-13
09-APR-17 2017-14 2017-13
10-APR-17 2017-14 2017-14
11-APR-17 2017-14 2017-14
7 rows selected
Session altered.
DT DT1 DT2
-------- ------- -------
05/04/17 2017-13 2017-13
06/04/17 2017-13 2017-13
07/04/17 2017-13 2017-13
08/04/17 2017-13 2017-13
09/04/17 2017-13 2017-13
10/04/17 2017-14 2017-14
11/04/17 2017-14 2017-14
7 rows selected
您可以看到,当NLS_TERRITORY
设置从America
更改时,您的查询在周日(即2017年4月9日)运行时会产生不同的结果(一周的第一天是星期日)到France
(一周的第一天是星期一)。
如果您所在的地区是一周的第一天是星期一,那么您可以将查询简化为:
TO_CHAR(dt-7,'IYYY-IW')