sql中的Trunc functiong示例

时间:2017-04-05 18:36:00

标签: sql oracle

我遇到了以下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”函数的用法,因为我无法理解它。

由于

1 个答案:

答案 0 :(得分:1)

  1. to_date('{RUN_DATE_YYYYMMDD}','YYYYMMDD')会将您的字符串转换为DATE数据类型。
  2. date_value - 7从该日期开始减去7天。
  3. TRUNC( date_value, 'D' )会将日期值截断为一周中第一天的午夜(由NLS_TERRITORY会话参数确定)。
  4. date_value + 4添加了4天的日期。
  5. TO_CHAR( date_value, 'IYYY-IW' )根据ISO标准将日期转换为:4位数年份;然后是基于ISO标准的一周(1-52或1-53)。
  6. 查看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')