【问题标题】:Trying to Remove Errors from this SQL Query尝试从此 SQL 查询中删除错误
【发布时间】:2013-07-15 16:00:19
【问题描述】:

我有一个相当长的 SQL 查询,它将数字日期数据类型转换为日期时间值,并根据我的要求进一步指定搜索。但是,我收到了一些我似乎无法解决的错误,我想知道是否有人可以修改我的查询以使其无错误运行。

这是我的查询:

SELECT [Object] AS [Dataset],
CAST(DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
SUBSTRING([Date],10,2)+':'+
SUBSTRING([Date],12,2)+':'+
SUBSTRING([Date],14,2)+'.'+
SUBSTRING([Date],15,3))) AS DATE) 'Date',
  LEFT(CAST(DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
SUBSTRING([Date],10,2)+':'+
SUBSTRING([Date],12,2)+':'+
SUBSTRING([Date],14,2)+'.'+
SUBSTRING([Date],15,3))) AS TIME),8) 'Time',
 MsgId,
 Parms,
CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6)
    ELSE '' --Optional ELSE
END  AS [Dataset],
FROM ( SELECT  ItemId,
CONVERT(VARCHAR(18),[Date]) [Date],
[Object],
MsgID,
Parms,
FROM JnlDataSection
WHERE CAST(substring(convert(varchar(50), [Date]), 0, 5) + '-' +
substring(convert(varchar(50), [Date]), 5, 2) + '-' +
substring(convert(varchar(50), [Date]), 7, 2) AS DATETIME) =
CONVERT(date, DATEADD(day, -1, getdate()))) A --Converting to date again to remove       the time part
WHERE SUBSTRING(Parms,35,6) = 'X05219'
ORDER BY [DATE] DESC;

这些是错误:

Msg 156, Level 15, State 1, Line 17
Incorrect syntax near the keyword 'FROM'.

Msg 156, Level 15, State 1, Line 22

Please Note: I'm using SQL Server Management Studio 2008
Incorrect syntax near the keyword 'FROM'.

【问题讨论】:

    标签: sql date time casting


    【解决方案1】:

    FROM 之前有一个额外的逗号:

    END  AS [Dataset],
    

    应该是

    END  AS [Dataset]
    

    【讨论】:

    • 在不知道您要检索的记录的情况下,我会猜测并说其中一个 where 子句中的子字符串可能是错误的。首先尝试仅查询该子字符串,看看是否可以提取该记录。
    • 您从 [DATE] 提取到 DATE 和 TIME 的内容似乎不正确。您将相同的字符串放入“日期”和“时间”
    【解决方案2】:

    去掉上面的 [Dataset] 之后的逗号。还有

    Parms,
    FROM JnlDataSection
    

    Parms 后面不应该有逗号

    【讨论】:

      【解决方案3】:

      尝试删除 from 子句之前的“,”。新查询应如下所示...

      SELECT [Object] AS [Dataset],
        CAST(DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
        SUBSTRING([Date],10,2)+':'+
        SUBSTRING([Date],12,2)+':'+
        SUBSTRING([Date],14,2)+'.'+
        SUBSTRING([Date],15,3))) AS DATE) 'Date',
        LEFT(CAST(DATEADD(HOUR,-4,CONVERT(DATETIME,LEFT([Date],8)+' '+
       SUBSTRING([Date],10,2)+':'+
       SUBSTRING([Date],12,2)+':'+
       SUBSTRING([Date],14,2)+'.'+
       SUBSTRING([Date],15,3))) AS TIME),8) 'Time',
       MsgId,
       Parms,
       CASE WHEN MsgID = '61' THEN SUBSTRING(Parms,35,6)
       ELSE '' --Optional ELSE
       END  AS [Dataset]
      FROM ( SELECT  ItemId,
      CONVERT(VARCHAR(18),[Date]) [Date],
      [Object],
      MsgID,
      Parms
      FROM JnlDataSection
      WHERE CAST(substring(convert(varchar(50), [Date]), 0, 5) + '-' +
      substring(convert(varchar(50), [Date]), 5, 2) + '-' +
      substring(convert(varchar(50), [Date]), 7, 2) AS DATETIME) =
      CONVERT(date, DATEADD(day, -1, getdate()))) A --Converting to date again to remove          the time part
      WHERE SUBSTRING(Parms,35,6) = 'X05219'
      ORDER BY [DATE] DESC;
      

      【讨论】:

      • 它运行时没有错误,但由于某种原因列是空的。
      • 这可能有多种原因。最好的办法是将查询分解成更小的部分。我将首先运行您的子查询而不使用 where 子句。如果记录返回,则开始逐个添加 where 子句,直到找到哪个子句阻止记录返回。
      猜你喜欢
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多