Teradata SQL查询中IN子句中的日期算术

时间:2013-06-28 17:57:38

标签: sql teradata

这里的前两个查询工作正常:

SELECT * FROM sys_calendar.calendar
WHERE calendar_date BETWEEN CAST('2012-06-01' AS DATE) - 365 
                        AND CAST('2013-06-01' AS DATE) - 1;

SELECT * FROM sys_calendar.calendar
WHERE calendar_date IN ('2012-06-01', '2013-06-03');

但是,接下来的两个查询会抛出错误

  

SELECT失败。 [3706]语法错误:预期在')'和','。

之间

似乎CAST正在抛弃IN子句,但我不明白为什么。这是怎么回事?

SELECT * FROM sys_calendar.calendar
WHERE calendar_date IN (CAST('2012-06-01' AS DATE) 
                      , CAST('2013-06-03' AS DATE));

SELECT * FROM sys_calendar.calendar
WHERE calendar_date IN (CAST('2012-06-01' AS DATE) - 365
                      , CAST('2013-06-01' AS DATE) - 1);

2 个答案:

答案 0 :(得分:3)

我不知道为什么,但是当你尝试在IN子句中添加除文字以外的任何其他内容时,Teradata的解析器总会抱怨。

要摆脱CAST很简单,只需使用推荐的日期文字语法:

DATE '2012-06-01'

但是当你需要计算时,你必须切换到ORed条件:

WHERE calendar_date = DATE '2012-06-01' - 365
   OR calendar_date = DATE '2013-06-01' - 1;

迪特

答案 1 :(得分:0)

我挖掘了IN/NOT IN条目的Teradata SQL手册。 IN语句包含:

  • 表达
  • 一系列有符号常量
  • 常量列表

您不能拥有表达式列表,即像我一样在运行中进行日期算术。

  

如果IN与单项运算符一起使用,则该运算符可以是a   常数或表达。如果使用多项运算符,那就是   运算符必须由常量组成;表达式是不被允许的。