Teradata 周计算

Teradata Week Calculation

我在 teradata 中有一个查询,我试图从特定日期获取周数,格式为 yyyymmdd (20160201)。我们有一个日历 table(不是 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)

我收到错误

SELECT Failed. 3706: Syntax error: expected something between ')' and '-'.

有没有人见过这个?

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

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

提交相同的查询

而且你的计算过于复杂,尽量避免昂贵的类型转换date/string:

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