Sql Teradata周计算

Sql Teradata周计算,sql,teradata,week-number,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.ru

我在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:语法错误:应介于和“-”之间

以前有人见过吗?

不能将AS放在where子句中 它只在查询列中被接受

不能将AS放在where子句中 它只在查询列中被接受

DAYOFWEEK不是现有的Teradata函数,它是ODBC语法,在您的情况下,ODBC驱动程序有时显然不会自动将其转换为有效的Teradata SQL。当您使用正确的语法{fn DAYOFWEEKDATE_uDate}时,它将起作用,但是您应该始终避免在ODBC选项中使用那些ODBC函数check 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
DAYOFWEEK不是现有的Teradata函数,它是ODBC语法,在您的情况下,ODBC驱动程序有时显然不会自动将其转换为有效的Teradata SQL。当您使用正确的语法{fn DAYOFWEEKDATE_uDate}时,它将起作用,但是您应该始终避免在ODBC选项中使用那些ODBC函数check 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

嗨,谢谢你的快速回复。我不太明白。如果我使用castCastDate-DAYOFWEEKDATE-5格式'yyyyymmdd'作为CHAR8作为INT,并且不连接到其上的另一个表,那么它可以正常工作。当您想加入另一个表时,这是不允许的吗?请这样使用:从表\u main AL1 join cal\u table cal ON AL1.run\u date=cal.cal\u dateyyyymmdd其中AL1.run\u date>=CASTCASTDATE-DayyOfWeeKDate-5格式'yyyyyyyymmdd'作为CHAR8,AL1.run\u date=CASTCASTDATE-DayyOfWeeKDate-5格式'yyyyyyyymmdd'作为CHAR8,AL1.run\u date