我试图获取两个DateTime值之间的DateTime差异.
查询我到目前为止,
DECLARE @start datetime = '2012-01-01 12:00:00.000'
DECLARE @end datetime = '2013-01-01 11:59:59.999'
SELECT
CONVERT(VARCHAR(5),DATEDIFF(YYYY, @start, @end))
+'-'+ CONVERT(VARCHAR(5),DATEDIFF(MONTH, @start, @end))
+'-'+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)/86400)
+' '+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)%86400/3600)
+':'+ CONVERT(VARCHAR(5),DATEDIFF(SECOND, @start, @end)%3600/60)
+':'+ CONVERT(VARCHAR(5),(DATEDIFF(SECOND, @start, @end)%60))
+'.'+ CONVERT(VARCHAR(5),(DATEDIFF(SECOND, @start, @end)%100))
AS [YYYY-MM-DD HH:MM:SS.MSS]
Run Code Online (Sandbox Code Playgroud)
期望的输出
0001-00-00 23:59:59.999
365 Days, 23 Hours, 59 Minutes, 59 Seconds, 999 Milliseconds
Run Code Online (Sandbox Code Playgroud)
实际产出
1-12-366 8784:0:0.0
Run Code Online (Sandbox Code Playgroud)
谢谢
日期时间精度四舍五入为.000,.003或.007秒的增量.为了更好的准确性,请使用 DateTime2数据类型.
DECLARE @start datetime2 = '2012-01-01 12:00:00.000'
DECLARE @end datetime2 = '2013-01-01 11:59:59.999'
--I do this way because millisecond difference overflows the integer.
select datediff(day, @start, @end) days,
datediff(millisecond, convert(time, @start), convert(time, @end)) milliseconds
Run Code Online (Sandbox Code Playgroud)
结果和小提琴演示:
days | milliseconds
366 | -1
Run Code Online (Sandbox Code Playgroud)
以上结果意味着您可以获得所需的结果:
(366 days - 1 millisecond) =
365 Days, 23 Hours, 59 Minutes, 59 Seconds, 999 Milliseconds
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,给定的两个日期之间的毫秒差异太高,实际上溢出bigint也是如此.所以我使用这种方法 来得到你期望的答案.
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |