Teradata 使用 SQL 代码获取周数

Teradata Get Week Number using SQL Code

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

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

我发现这个 code 当你用 DATE 代替 cdate

时效果很好
SELECT 
((cdate - ((EXTRACT(YEAR FROM cdate) - 1900) * 10000 + 0101 (DATE))) -     ((cdate - DATE '0001-01-07') MOD 7)  + 13) / 7

我的日期格式为 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

"User cannot perform that operation on DATE"

如有任何帮助,我们将不胜感激

日期格式仅用于转换为字符串(=显示),但数据类型 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

但是您的星期似乎是根据国际标准计算的,并且此计算不会 return 一年中最后几天的正确数字,例如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

编辑:

这些功能是在 TD14 中添加的,之后您可以使用以下代码用于 ISO week/year:

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')
;

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