无法减去日期SQL Server

时间:2013-07-29 07:20:06

标签: sql sql-server sql-server-2008

我正在尝试使用此查询获取日期时差:

SELECT BASESCORE, 
       Max(CONVERT(DATETIME, '')) - Min(CONVERT(DATETIME, '')) AS datediff 
FROM   log 
GROUP  BY BASESCORE 
ORDER  BY BASESCORE 

它运作正常,但它给出了我的错误:

   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
   1900-01-01 00:00:00.000
                    ......

如何从上述查询中获得正确的结果!

5 个答案:

答案 0 :(得分:3)

正如@Nithesh所说,尝试使用DATEDIFF -

DECLARE @temp TABLE(
       [datetime] DATETIME
     , basescore INT
)

INSERT INTO @temp
VALUES
     ('20130320 03:17:43', 1),
     ('20130320 03:17:43', 2),
     ('20130320 04:17:43', 1),
     ('20130320 03:20:43', 2)

SELECT
       basescore
     , [datediff] = CONVERT(
                         VARCHAR(10), 
                         DATEADD(ms, 
                         DATEDIFF([second], MIN([datetime]), MAX([datetime])) * 1000, 
                    0), 114)
FROM @temp
GROUP BY basescore
ORDER BY basescore

输出 -

basescore   datediff
----------- ----------
1           01:00:00:0
2           00:03:00:0

答案 1 :(得分:3)

使用您发布的样本数据(并稍微调整一下),这是我尝试解决问题的方法:

SELECT BASESCORE, 
       Datediff(dd, MINDATE, MAXDATE) 
FROM   (SELECT BASESCORE, 
               Cast(Max(DATETIME) AS DATETIME) MaxDate, 
               Cast(Min(DATETIME) AS DATETIME) MinDate 
        FROM   table1 
        GROUP  BY BASESCORE)T 

您可以查看SQL Fiddle上的完整工作版本。

让我知道是否有一些我误解的东西; - )

答案 2 :(得分:2)

之前您向您展示了dateformat,您再次删除了该格式,但我有时间复制它。 在我看来,这是您想要的查询和结果:

declare @t table(datetime char(20), basescore int)
insert @t values('20/Mar/2013:03:17:43', 1),('20/Mar/2013:03:17:43', 2)
                ('20/Mar/2013:04:17:43', 1),('20/Mar/2013:03:20:43', 2)

SELECT basescore,  MAX(convertdate) - MIN(convertdate) AS datediff
-- when selecting from your own table remove '@t' from next line
FROM @t log
cross apply(select cast(stuff([datetime], 12, 1, ' ') as datetime) convertdate) a
group by basescore order by basescore

结果:

basescore   datediff
1   1900-01-01 01:00:00.000
2   1900-01-01 00:03:00.000

答案 3 :(得分:1)

使用DATEDIFF()

语法:DATEDIFF(datepart,startdate,enddate)

msdn

答案 4 :(得分:1)

我上次从您的帖子编辑中看到,来自字段日期时间的值,例如' 20 / Mar / 2013:03:17:44'。日期时间值的格式无法通过简单的方式进行转换。

尝试此查询:

SELECT BASESCORE, 
       [DATEDIFF]= Datediff(second, Min(CONVERT(DATETIME, 
                                        LEFT(Rtrim(Ltrim(DATETIME)), 
                                        11) + ' ' 
                                        + RIGHT(Rtrim(Ltrim(DATETIME) 
                                        ), 8))), Max 
                               ( 
                               CONVERT(DATETIME, LEFT(Rtrim(Ltrim(DATETIME)), 11 
                                                 ) + ' ' 
                                                 + RIGHT(Rtrim(Ltrim(DATETIME)), 
                                                 8)))) 
FROM   temptabel 
GROUP  BY BASESCORE 
ORDER  BY BASESCORE 

输出:

Basescore    datediff
1            1
2            0
3            0

您可以在SQLFiddle

看到