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 执行该操作”
任何帮助将不胜感激
日期格式仅用于转换为字符串(= 显示),但数据类型 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,您可以简单地剪切和粘贴计算。
| 归档时间: |
|
| 查看次数: |
10646 次 |
| 最近记录: |