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,您可以简单地剪切和粘贴计算。
我希望从 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,您可以简单地剪切和粘贴计算。