Teradata周计算

时间:2016-05-19 08:14:26

标签: sql teradata week-number

我在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)

我收到错误

  

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

有没有人见过这个?

2 个答案:

答案 0 :(得分:2)

DAYOFWEEK不是现有的Teradata函数,它的ODBC语法,有时(在您的情况下并非如此)由ODBC驱动程序自动转换为有效的Teradata SQL。当你使用正确的语法{fn DAYOFWEEK(DATE_)}时它会工作,但是你应该总是避免使用那些ODBC函数(在ODBC选项中检查禁用解析),因为当你提交它时它会失败使用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

答案 1 :(得分:0)

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