【问题标题】:Teradata Get Week Number using SQL CodeTeradata 使用 SQL 代码获取周数
【发布时间】:2015-09-26 00:46:03
【问题描述】:

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

例如第 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

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

任何帮助将不胜感激

【问题讨论】:

    标签: sql date teradata week-number


    【解决方案1】:

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

    但是您的一周似乎是基于国际标准,并且此计算不会返回一年中最后几天的正确数字,例如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 周/年使用以下代码:

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

    【讨论】:

    • 嗨@dnoeth,感谢您的快速回复...当我运行这两个脚本时,我收到错误消息:3707 语法错误,预期在 'dAtE' 关键字和字符串之间有类似 ')' 2'
    • 我刚刚测试过,对我来说效果很好。如何提交?
    • 提交如下 SELECT WEEKNUMBER_OF_YEAR (DATE '2015-06-29', 'ISO') SELECT TO_CHAR(DATE '2015-06-29', 'iw')
    • 这似乎是问题所在......我们仍在 13.10
    • @JohnSmith:为 TD13.10 添加了 ISO 计算 :-)
    猜你喜欢
    • 2015-07-06
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多