2

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

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');

但是,接下来的两个查询会引发错误

选择失败。[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);
4

2 回答 2

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;

迪特

于 2013-06-28T22:04:43.517 回答
0

我深入研究了 Teradata SQL 手册以获取该IN/NOT IN条目。IN声明包含以下任一内容:

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

你不能有一个表达式列表,即像我一样在飞行中进行日期算术。

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

于 2013-06-29T17:41:50.733 回答