2012-01-26 67 views
34

將包含毫秒的日期時間縮短爲只有秒的最佳方式是什麼?在T-SQL中將日期時間截斷爲秒(刪除毫秒)

例如2012-01-25 17:24:05.7842012-01-25 17:24:05

+0

邊注:在我我在比較日期時非常有趣,但忽略了微小的差異(爲了找到模糊匹配記錄)。找到'DATEDIFF(SECONDS ...)'小於1的位置會更有意義。 – bambams

回答

47

這將截斷毫秒。

declare @X datetime 
set @X = '2012-01-25 17:24:05.784' 
select convert(datetime, convert(char(19), @X, 126)) 

select dateadd(millisecond, -datepart(millisecond, @X), @X) 

CAST and CONVERT
DATEADD
DATEPART

3

下具有非常快速的性能,但它不僅能消除毫秒,而且舍入到分鐘。見(http://msdn.microsoft.com/en-us/library/bb677243.aspx)

select cast(yourdate as smalldatetime) from yourtable 

編輯:

下面的腳本是由該腳本從的Mikael和GBN我upvoted比較因爲兩個答案都很棒。該測試將顯示GBN」腳本比Mikaels稍快:

declare @a datetime 
declare @x int = 1 
declare @mikaelend datetime 

declare @mikael datetime = getdate() 
while @x < 5000000 
begin 
    select @a = dateadd(millisecond, -datepart(millisecond, getdate()), getdate()) , @x +=1 
end 
set @mikaelend = getdate() 

set @x = 1 
declare @gbnend datetime 
declare @gbn datetime = getdate() 
while @x < 5000000 
begin 
    select @a = DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101') , @x +=1 
end 
set @gbnend = getdate() 
select datediff(ms, @mikael, @mikaelend) mikael, datediff(ms, @gbn, @gbnend) gbn 

首先運行

mikael  gbn 
----------- ----------- 
5320  4686 

第二輪

mikael  gbn 
----------- ----------- 
5286  4883 

第三次運行

mikael  gbn 
----------- ----------- 
5346  4620 
+1

'smalldatetime'會截斷到最後。 (不知道我是否說得很對,也許我應該說一分鐘)。請參閱(http://msdn.microsoft.com/zh-cn/library/bb677243.aspx)中的示例。不想讓你失望,因爲這是我的嘗試,所以乍一看它*看起來像正確的答案 - 所以也許有助於離開這個。 –

+0

你說得對,我的不好。 smalldatetime顯示秒數,但始終爲0 –

+0

Ehh ..'@ mikael'計時通過*兩個*循環完成。 –

22

最快的,也是語言的安全性和確定性

DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101') 
+0

一個不錯的選擇,但是我必須將它從(不確定)打電話給你的例子,因爲它不是1970年 - UNIX時間)有一個人類可讀的時間戳。 –

+1

我用2000來避免整數溢出。你可以使用19700101如果你想 – gbn

+0

過去當我想用特定的MS進行組合時,比如每40個MS進行一次組合 - 有時真的希望它是大的int。 –

7
convert(datetime, convert(varchar, @datetime_var, 120), 120) 
+1

稍微更簡潔的是:CAST(CONVERT(VARCHAR,@date,120)AS DATETIME) –

3

所以,最簡單的方法是現在:

選擇轉換(DATETIME2(0),GETDATE())