【问题标题】:SQL Server gives syntax errorSQL Server 给出语法错误
【发布时间】:2015-12-10 11:40:27
【问题描述】:

我有以下适用于 Microsoft SQL Server 的 SQL

SELECT * 
FROM tblA
WHERE CREATION_DATE BETWEEN DATE'2015-09-12' AND DATE'2015-09-15'

但这会引发语法错误:

错误:“2015-09-12”附近的语法不正确。 SQLState:S0001 错误代码: 102

怎么了?我想使用 ANSI 文字代码。

【问题讨论】:

  • 列 creation_date 是否定义为日期数据类型?你能添加桌子的设计吗?可能你应该投。
  • SQL 服务器不支持 ANSI 日期文字,您需要将字符串文字转换为 DATE - CAST('2015-09-12' AS DATE)。另外,take care when using BETWEEN with dates
  • @GarethD,但您可以使用像 {d'2015-09-12'} 和 {ts'2015-09-15 23:59:59'}这样的 ODBC 文字

标签: sql sql-server date select


【解决方案1】:

这不是您在 MS SQL Server 中的投射方式。相反,您应该尝试cast 语法:

SELECT * 
FROM   tblA
WHERE  creation_date BETWEEN CAST('2015-09-12' AS DATE) AND 
                             CAST('2015-09-15' AS DATE)

【讨论】:

    【解决方案2】:

    您可以简单地使用此查询,无需添加日期:

    SELECT * 
    FROM tblA
    WHERE CREATION_DATE BETWEEN '2015-09-12' AND '2015-09-15'
    

    【讨论】:

    • 如果您使用 Oracle 进行相同的查询会怎样?我得到了字面上的错误。
    • @Guil 我只回答了 SQL,因为问题被标记为 SQL,而不是 Oracle。
    • 好吧,我现在问你,甲骨文呢?
    • 试试这个:SELECT * FROM tblA WHERE CREATION_DATE BETWEEN TO_DATE('2015-09-12','YYYY-MON-DD') AND TO_DATE('2015-09-15','YYYY-星期一至日')
    【解决方案3】:

    日期文字很棘手...除了转换问题(通常取决于您的系统文化),如果您使用 between,您必须考虑一天的结束!

    在这里,您可以找到一种独立于系统的方式来逐字写入日期:https://msdn.microsoft.com/en-us/library/ms187819.aspx?f=255&MSPPError=-2147217396(查看“ODBC”)

    所以你可以写

    BETWEEN {d'2015-09-12'} AND {ts'2015-09-12 23:59:59'}
    

    【讨论】:

      【解决方案4】:
      SELECT * 
      FROM   tblA
      WHERE  CREATION_DATE BETWEEN CAST('2015-09-12' AS DATE) 
                               AND CAST('2015-09-15' AS DATE)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-30
        • 1970-01-01
        • 2012-10-03
        相关资源
        最近更新 更多