首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sqlserver计算两个日期之差,精确到毫秒解决办法

2012-12-15 
sqlserver计算两个日期之差,精确到毫秒declare @starttime datetime,@endtime datetimeset @starttime20

sqlserver计算两个日期之差,精确到毫秒
declare @starttime datetime,@endtime datetime
set @starttime='2012-10-07 10:57:23.957'
set @endtime  ='2012-11-08 08:31:03.224'

如题,我要计算@endtime与@starttime的差值;应该得到 几天 几小时 几分 几秒 几毫秒

select datediff(part,@starttime,@endtime)
part使用day计算出来是32天,不对;
part使用ss,ss最大是60几天,超出的话不对;
part使用ms,ms最大是24小时多少多少,超出不对。

大神们,你们是怎么做的啊? 
[最优解释]

declare @starttime datetime,@endtime datetime,@T datetime
set @starttime='2012-10-07 10:57:23.957'
set @endtime  ='2012-11-08 08:31:03.224'
select @T = cast( cast(@endtime as float)-cast(@starttime as float) as datetime)
select cast(datediff(day,'1900-01-01',@T)as varchar(10))+'天'+cast(datepart(hh,@T)as varchar(10))
+'小时'+cast(datepart(mi,@T)as varchar(10))+'分'+cast(datepart(ss,@T)as varchar(10))+'秒'
+cast(datepart(ms,@T)as varchar(10))+'毫秒'

/*----------------------------
31天21小时33分39秒267毫秒

(1 行受影响)
*/

[其他解释]
加了个case when 判断
declare @starttime datetime2,@endtime datetime2
set @starttime='2012-10-07 10:57:23.957'
set @endtime  ='2012-11-08 08:31:03.224'

SELECT  CASE WHEN DATEDIFF(hour, @starttime, @endtime) < 24
             THEN CONVERT(VARCHAR(10), DATEDIFF(DAY, @starttime, @endtime) - 1)
             ELSE CONVERT(VARCHAR(10), DATEDIFF(DAY, @starttime, @endtime))
        END + '天' + CONVERT(VARCHAR(10), DATEDIFF(hour, @starttime, @endtime)
        % 24) + '时' + CONVERT(VARCHAR(10), DATEDIFF(mm, @starttime, @endtime)
        % 60) + '分' + CONVERT(VARCHAR(10), DATEDIFF(ss, @starttime, @endtime)
        % 60) + '秒'


/*
------------------------------------------------
32天22时1分40秒

(1 行受影响)
*/

[其他解释]
日期本来就可以转换为数值型。
DECLARE @a DATETIME 
SET @a=0
SELECT @a

0代表1900-01-01 00:00:00.000 

那些值是从0开始加上去,好像是秒数
[其他解释]
declare @starttime datetime,@endtime datetime
set @starttime='2012-10-07 10:57:23.957'
set @endtime  ='2012-11-08 08:31:03.224'

SELECT CONVERT(VARCHAR(10),DATEDIFF(DAY,@starttime,@endtime))+'天'+CONVERT(VARCHAR(10),DATEDIFF(hour,@starttime,@endtime)%24)+'时'+
CONVERT(VARCHAR(10),DATEDIFF(mm,@starttime,@endtime)%60)+'分'+CONVERT(VARCHAR(10),DATEDIFF(ss,@starttime,@endtime)%60)+'秒'

/*
------------------------------------------------
32天22时1分40秒

(1 行受影响)
*/

[其他解释]
写程序去处理时间吧,不要在数据库里纠结了。
------其他解决方案--------------------


如果你不精确到月份,那么32天是对的。
[其他解释]

引用:
如果你不精确到月份,那么32天是对的。

你看吧,加上时分秒应该是31天多
[其他解释]
引用:
如果你不精确到月份,那么32天是对的。

不是说精确到毫秒么.
[其他解释]
毫秒不懂怎么搞
[其他解释]
毫秒会报错:
消息 535,级别 16,状态 0,第 9 行
datediff 函数导致溢出。用于分隔两个日期/时间实例的日期部分的数字太大。请尝试使用日期部分精度较低的 datediff。
[其他解释]
毫秒会报错:
消息 535,级别 16,状态 0,第 9 行
datediff 函数导致溢出。用于分隔两个日期/时间实例的日期部分的数字太大。请尝试使用日期部分精度较低的 datediff。
[其他解释]
就精确到秒嘛,我知道了,秒不会溢出
对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。
我就用datediff(ss,@starttime,@endtime),然后再来除
[其他解释]
引用:
SQL code



12345678910111213

declare @starttime datetime,@endtime datetime,@T datetime set @starttime='2012-10-07 10:57:23.957'set @endtime  ='2012-11-08 08:31:03.224'select @T = cast( cast(@e……

这个可以,但是不懂为什么datetime可以通过cast转换成float,然后又可以转回去呢,这是什么原理呢??
[其他解释]
说错了,是天数
[其他解释]
哦,原来是这样啊
[其他解释]
引用:
说错了,是天数




走到哪里都能看到你熟悉的大花
[其他解释]
引用:
不然怎么拿花





select DATEDIFF(nanosecond,'2012-10-07 10:57:23.957','2012-10-07 10:57:25.957') 毫秒
----------------------------------------
毫秒
-----------
2000000000

(1 行受影响)



然来毫秒真的好小:nanosecond
[其他解释]
不然怎么拿花

热点排行