【问题标题】:Date arithmetic within an IN clause in a Teradata SQL queryTeradata SQL 查询中 IN 子句中的日期算术
【发布时间】:2013-06-30 01:41:50
【问题描述】:

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

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

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

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

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

    DATE '2012-06-01'
    

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

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

    节食

    【讨论】:

      【解决方案2】:

      我查阅了 Teradata SQL 手册中的 IN/NOT IN 条目。 IN 语句包含:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-01-02
        • 2012-07-17
        • 2016-04-25
        • 2012-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多