【问题标题】:Teradata Week CalculationTeradata 周计算
【发布时间】:2016-09-15 23:57:11
【问题描述】:

我在 teradata 中有一个查询,我试图从 yyyymmdd (20160201) 格式的特定日期获取周数。我们有一个日历表(不是 teradata 表,因为我们对周数的计算方式略有不同)允许您加入日期并导出结果

当我使用静态日期运行查询时,下面的示例运行良好

FROM table_main AL1
 JOIN cal_table cal
  ON  AL1.run_date = cal.cal_dateyyyymmdd
WHERE AL1.run_date >= 20160201
AND AL1.run_date < 20160220

当我试图将陈述概括为前一周时

FROM table_main AL1
 JOIN cal_table cal
  ON  AL1.run_date = cal.cal_dateyyyymmdd
WHERE AL1.run_date >= CAST(CAST(((DATE-DAYOFWEEK(DATE)-5) (FORMAT 'YYYYMMDD')) AS CHAR(8)) AS INT)
AND AL1.run_date < CAST(CAST(((DATE-DAYOFWEEK(DATE)+ 1) (FORMAT 'YYYYMMDD')) AS CHAR(8)) AS INT)

我得到了错误

选择失败。 3706:语法错误:预期在 ')' 和 '-' 之间。

有人见过这个吗?

【问题讨论】:

    标签: sql teradata week-number


    【解决方案1】:

    DAYOFWEEK 不是现有的 Teradata 函数,它是 ODBC 语法,有时(显然不是您的情况)由 ODBC 驱动程序自动转换为有效的 Teradata SQL。当您使用正确的语法{fn DAYOFWEEK(DATE_)} 时它会起作用,但恕我直言,您应该始终避免使用那些 ODBC 函数(在 ODBC 选项中检查 Disable Parsing),因为当您使用JDBC/.NET/CLI。

    而且你的计算过于复杂,尽量避免昂贵的类型转换日期/字符串:

    WHERE AL1.run_date >= CAST(NEXT_DAY(DATE-13, 'mon') AS INT) + 19000000
    AND AL1.run_date < CAST(NEXT_DAY(DATE-7, 'sun') AS INT) + 19000000
    
    NEXT_DAY(..., 'mon') -- find the next monday
    CAST(... AS INT) -- returns YYMMDD
    ... + 19000000 -- to match your date key
    

    【讨论】:

    • 谢谢@dnoeth。这就是我一直在寻找的。我还发现我可以完全删除表格并使用 week(cast((run_date - 19000000 ) AS DATE)) as week_num 这似乎有效
    • @JohnSmith: week 是另一个 ODBC 函数,我怀疑它总是返回正确的数字。如果您需要 ISO 周 WEEKNUMBER_OF_YEAR 可能是您想要的,有一个 ISO 选项。
    【解决方案2】:

    您不能将 (AS) 放在 (where 子句) 它仅在查询列中被接受。

    【讨论】:

    • 您好,感谢您的快速回复。我不确定我是否遵循。如果我使用CAST(CAST(((DATE-DAYOFWEEK(DATE)-5) (FORMAT 'YYYYMMDD')) AS CHAR(8)) AS INT) 并且不加入它上面的另一个表,它工作正常。当你想加入另一个表时是不允许的吗?
    • 像这样使用它: FROM table_main AL1 JOIN cal_table cal ON AL1.run_date = cal.cal_dateyyyymmdd WHERE AL1.run_date >= CAST(CAST(((DATE-DAYOFWEEK(DATE)-5) (FORMAT) 'YYYYMMDD')) AS CHAR(8)) ) AND AL1.run_date
    • 嗨@Mohamed,您能否向我解释一下您所做的更改,因为它看起来与我的第二段代码中的问题陈述相同
    • 对不起@JohnSmith 我错过了理解,这是我第一次看到(CAST)声明。我会删除我的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 2014-11-16
    • 2018-08-17
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多