更正时间

时间:2017-01-05 08:42:15

标签: sql sql-server datetime error-correction

我有一个表有一个名为[平均回答时间]的日期时间字段。对于某些记录,时间显示不正确,如下所示:

1899-12-30 01:04:00.000
1899-12-30 01:05:00.000
1899-12-30 01:30:00.000

这里显示的时间是错误的。上面显示的时间是小样本,但它们需要在几分钟而不是几小时和几分钟内格式化

有没有办法用SQL脚本来解决这个问题,因为替代方案涉及再次提取数据,这将非常困难和耗时。

1 个答案:

答案 0 :(得分:1)

您可以使用DATEPART

  

返回一个整数,表示指定日期的指定日期部分。

结合DATEADD

  

返回指定的日期,并将指定的数字间隔(有符号整数)添加到该日期的指定日期部分。

示例:

DECLARE @val AS DATETIME = '1899-12-30 01:30:00.000';

SELECT  @val; -- 1899-12-30 01:30:00.000

SET @val = DATEADD(SECOND, DATEPART(MINUTE, @val),
                   DATEADD(MINUTE, ( DATEPART(HOUR, @val) ),
                           CAST(CAST(@val AS DATE) AS DATETIME)));

SELECT  @val; -- 1899-12-30 00:01:30.000

这会将值转换为date,以剥离时间部分并返回datetime以将时间设置为00:00:00。然后根据小时值和基于分钟值的秒数添加分钟。

您可以将此选项与UPDATE语句一起使用,但请确保使用WHERE子句以避免更新所有内容,除非这是您的意图。

示例更新查询:

CREATE TABLE #temp
    (
      AvgTimeToAnswer DATETIME
    );

INSERT  INTO #temp
        ( AvgTimeToAnswer )
VALUES  ( '1899-12-30 01:30:00.000' );

SELECT  *
FROM    #temp; -- 1899-12-30 01:30:00.000

UPDATE  #temp
SET     AvgTimeToAnswer = DATEADD(SECOND, DATEPART(MINUTE, AvgTimeToAnswer),
                              DATEADD(MINUTE,
                                      ( DATEPART(HOUR, AvgTimeToAnswer) ),
                                      CAST(CAST(AvgTimeToAnswer AS DATE) AS DATETIME)));
-- WHERE some condition

SELECT  *
FROM    #temp; -- 1899-12-30 00:01:30.000

DROP TABLE #temp;