2

我有一个很久以前被编程为 ( numeric(17,9), not null) 数据类型的日期列(例如 20130623.1434480600)。我只对当天前一天的数据和 UserCode=Automation 感兴趣,因为将发送的报告将仅包含 1 天前自动完成的结果。我已将其转换为具有以下查询以及特定用户要求的DateTime函数 ( ):6/23/2013 10:34:48

这显示在Date列下:2013-06-23 16:54:56.993

我想出了这个查询,但它给了我一些错误:

    SELECT 
    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',
    [Object] AS [Dataset],
    SUBSTRING(Parms,1,6) AS [Media]
    FROM (Select 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))) A
    Where MsgID = '325' AND
    SUBSTRING(Parms,1,6) = 'V40449' 
    Order By Date DESC;

错误:

消息 102,级别 15,状态 1,第 11 行 ',' 附近的语法不正确。消息 4145,级别 15,状态 1,第 21 行 在预期条件的上下文中指定的非布尔类型的表达式,靠近 ')'。所需输出:

  • 第一栏: 日期:2013-06-23
  • 第二栏:时间:16:54

任何人都可以就我如何获得所需的输出对我当前的代码提出任何建议吗?

那将不胜感激。

4

1 回答 1

1

在 SQL Server 中,您可以分别转换为 DATE 和 TIME:

SELECT CAST('6/23/2013 10:34:48' AS DATE), CAST('6/23/2013 10:34:48' AS TIME)

所以对于你的例子:

SELECT  ItemId,
 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) 'DateOnly',
 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) 'TimeOnly',
 [Object],
 SourceSite,
 DestSite
 FROM (  SELECT  ItemId,
    CONVERT(VARCHAR(18),[Date]) [Date],
    [Object],
    SourceSite,
    DestSite,
                UserCode
 FROM JnlMediumMove
 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 UserCode = 'Automation'
 ORDER BY [Date] DESC;
于 2013-06-24T19:41:58.293 回答