这里的前两个查询工作正常:
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);
答案 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 常数或表达。如果使用多项运算符,那就是 运算符必须由常量组成;表达式是不被允许的。