Teradata 使用 SQL 代码获取周数

Joh*_*ith 2 sql date teradata week-number

我希望从 teradata 中的日期获取周数我可以看到有使用 Sys Calendar Table 的解决方案,但我想使用代码来获取周数

例如,第 28 周是 7 月 6 日至 12 日(含)

我发现这段代码在你输入 DATE 而不是 cdate 时可以正常工作

SELECT 
((cdate - ((EXTRACT(YEAR FROM cdate) - 1900) * 10000 + 0101 (DATE))) -     ((cdate - DATE '0001-01-07') MOD 7)  + 13) / 7
Run Code Online (Sandbox Code Playgroud)

我的日期格式为 MM/DD/YY,当我运行它时,我收到错误消息

SELECT ((06/29/15 - ((EXTRACT(YEAR FROM 06/29/15) - 1900) * 10000 + 0101     (DATE))) - ((06/29/15 - DATE '0001-01-07') MOD 7)  + 13) / 7
Run Code Online (Sandbox Code Playgroud)

“用户无法在 DATE 执行该操作”

任何帮助将不胜感激

dno*_*eth 5

日期格式仅用于转换为字符串(= 显示),但数据类型 DATE 没有格式,它是一个整数。

06/29/15不是日期,它是基于整数的计算6 / 29 / 15,结果是整数零。

日期总是以 ISO 格式指定DATE '2015-06-29'::

((DATE '2015-06-29' - ((EXTRACT(YEAR FROM DATE '2015-06-29') - 1900) * 10000 + 0101     (DATE))) - ((DATE '2015-06-29' - DATE '0001-01-07') MOD 7)  + 13) / 7
Run Code Online (Sandbox Code Playgroud)

但是您的一周似乎基于国际标准,并且此计算不会返回一年最后几天的正确数字,例如,2014 年 12 月 31 日星期三将是第 53 周,而在 ISO 中它应该是第 1 周。如果需要 ISO 周,您最好使用

WEEKNUMBER_OF_YEAR (DATE '2015-06-29', 'ISO') -- integer
or
TO_CHAR(DATE '2015-06-29', 'iw')  -- string
Run Code Online (Sandbox Code Playgroud)

编辑:

这些函数是在 TD14 中添加的,然后您可以使用以下代码表示 ISO 周/年:

REPLACE FUNCTION iso_week(cdate DATE)
RETURNS INT
SPECIFIC iso_week_date
RETURNS NULL ON NULL INPUT
CONTAINS SQL
DETERMINISTIC
COLLATION INVOKER
INLINE TYPE 1
RETURN 
                      (((cDate - ((cdate - DATE '0001-01-01') MOD 7) + 5)
  - ((EXTRACT(YEAR FROM (cDate - ((cdate - DATE '0001-01-01') MOD 7) + 5)) - 1900) * 10000 + 0101 (DATE))) / 7) + 1  (FORMAT '99')
;

REPLACE FUNCTION iso_year(cdate DATE)
RETURNS INT
SPECIFIC iso_year_date
RETURNS NULL ON NULL INPUT
CONTAINS SQL
DETERMINISTIC
COLLATION INVOKER
INLINE TYPE 1
RETURN  
  EXTRACT (YEAR FROM (cDate - (((cdate - DATE '0001-01-01') MOD 7) + 1) + 4)) (FORMAT '9999')
;
Run Code Online (Sandbox Code Playgroud)

如果您不被允许创建 SQL UDF,您可以简单地剪切和粘贴计算。