sql server中两个日期时间的差异

Jib*_*oor 77 sql sql-server datetime

有没有办法datetime在sql server中区分两个?

例如,我的日期是

  1. 2010-01-22 15:29:55.090
  2. 2010-01-22 15:30:09.153

所以,结果应该是14.063 seconds.

And*_*rew 89

只是添加一个关于DateDiff的警告,它会计算您指定的单位边界的次数,因此如果您正在寻找精确的时间跨度,则会遇到问题.例如

select datediff (m, '20100131', '20100201')
Run Code Online (Sandbox Code Playgroud)

给出1的答案,因为它从1月到2月越过边界,所以即使跨度为2天,datediff将返回值1 - 它越过1个日期边界.

select datediff(mi, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')
Run Code Online (Sandbox Code Playgroud)

给出值1,再次,它通过分钟边界一次,所以即使它是大约14秒,当使用Minutes作为单位时,它将作为单个分钟返回.


gbn*_*gbn 25

SELECT DATEDIFF (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
Run Code Online (Sandbox Code Playgroud)

在MSDN上基于DATEDIFF替换"MyUnits"


Qua*_*noi 16

SELECT  DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')
Run Code Online (Sandbox Code Playgroud)

更换day与其他单位要进去的差异,如second,minute等.


小智 13

我可以提到MS SQL Server的四个重要功能,它们非常有用:

1)函数DATEDIFF()负责计算两个日期之间的差异,结果可能是" 第一个参数(datepart)上指定的" 年度季度日,每年每周工作小时第二毫秒微秒纳秒 " :

select datediff(day,'1997-10-07','2011-09-11')
Run Code Online (Sandbox Code Playgroud)

2)您可以使用函数GETDATE()来获取实际时间并计算某些日期和实际日期的差异:

select datediff(day,'1997-10-07', getdate() )
Run Code Online (Sandbox Code Playgroud)

3)另一个重要的函数是DATEADD(),用于在datetime中使用相同的日期部分转换某些值,您可以将其添加(带正值)或减去(带负值)到一个基准日期:

select DATEADD(day,  45, getdate()) -- actual datetime adding 45 days
select DATEADD(  s,-638, getdate()) -- actual datetime subtracting 10 minutes and 38 seconds
Run Code Online (Sandbox Code Playgroud)

4)函数CONVERT()用于格式化您需要的日期,它不是参数函数,但您可以使用部分结果来格式化您需要的结果:

select convert(  char(8), getdate() ,   8) -- part hh:mm:ss of actual datetime
select convert(  varchar, getdate() , 112) -- yyyymmdd
select convert( char(10), getdate() ,  20) -- yyyy-mm-dd limited by 10 characters
Run Code Online (Sandbox Code Playgroud)

DATETIME冷却以秒计算,混合这四个函数的一个有趣结果是显示两个日期之间的小时,分钟和秒(hh:mm:ss)的格式差异:

declare  @date1 datetime, @date2 datetime
set @date1=DATEADD(s,-638,getdate())
set @date2=GETDATE()

select convert(char(8),dateadd(s,datediff(s,@date1,@date2),'1900-1-1'),8)
Run Code Online (Sandbox Code Playgroud)

...结果是00:10:38(638s = 600s + 38s = 10分38秒)

另一个例子:

select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1
Run Code Online (Sandbox Code Playgroud)


rch*_*cko 7

我尝试过这种方法,它确实有效。我使用SQL Server 2016版

SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;
Run Code Online (Sandbox Code Playgroud)

不同的DATEDIFF函数是:

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
Run Code Online (Sandbox Code Playgroud)

参考:https : //docs.microsoft.com/zh-cn/sql/t-sql/functions/datediff-transact-sql? view = sql-server- 2017


Fan*_*o68 7

好的,我们都知道答案涉及DATEDIFF()。但这只会给您带来可能获得的结果的一半。如果您想以人类可读的格式获得两个DATETIME值之间的分钟和秒结果怎么办?

CONVERT()DATEADD()当然DATEDIFF()功能是完美的一个更易读的结果,你的客户端可以使用,而不是数量。

IE

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 
Run Code Online (Sandbox Code Playgroud)

这会给你类似的东西:

时:分

如果您想要更高的精度,只需增加VARCHAR().

CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 
Run Code Online (Sandbox Code Playgroud)

时:MM.SS.MS


Red*_*ter 5

在SQL Server内部,日期存储为2个整数。第一个整数是基准日期(1900/01/01)之前或之后的日期数。第二个整数存储午夜之后的时钟滴答数,每个滴答是1/300秒。

更多信息在这里

因此,我经常发现比较日期的最简单方法是简单地减去日期。这处理了我90%的用例。例如,

select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...
Run Code Online (Sandbox Code Playgroud)

当我需要除天以外的单位的答案时,我将使用DateDiff

  • 请注意,这仅适用于旧的“ DATETIME”类型,不适用于“ DATE”,“ TIME”或“ DATETIME2”。同样,返回的值将是另一个`DATETIME`,因此您需要将其强制转换为可读取的日期之间的天数。 (5认同)

小智 5

有多种方法可以查看日期差,并且在比较日期/时间时有更多方法。这是我用来获取格式为“ HH:MM:SS”的两个日期之间的差的方法:

ElapsedTime AS
      RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)
Run Code Online (Sandbox Code Playgroud)

我将其用于计算列,但您可以轻松地将其重写为UDF或查询计算。注意,此逻辑舍入小数秒;00:00.00到00:00.999被视为零秒,并显示为“ 00:00:00”。

如果您预计周期可能超过几天,则在需要时,此代码将切换为D:HH:MM:SS格式:

ElapsedTime AS
    CASE WHEN DATEDIFF(S, StartDate, EndDate) >= 359999
        THEN
                          CAST(DATEDIFF(S, StartDate, EndDate) / 86400        AS VARCHAR(7)) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 86400 / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %  3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %    60        AS VARCHAR(2)), 2)
        ELSE
              RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)
        END
Run Code Online (Sandbox Code Playgroud)


小智 5

以下查询应提供您正在寻找的确切内容。

select datediff(second, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')
Run Code Online (Sandbox Code Playgroud)

这是来自 MSDN 的链接,了解您可以使用 datediff 函数做什么。 https://msdn.microsoft.com/en-us/library/ms189794.aspx