我在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:语法错误:预期在')'和' - '之间。
有没有人见过这个?
答案 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子句)中 它仅在查询列中被接受。