2010-02-11 207 views
22

從SQL Server中選擇時,我想獲取日期,但省略了毫秒值,並且希望將其作爲日期類型。所以如果我有一個值1/1/2009 1:23:11.923,我想省略毫秒,但保留日期類型,所以它將是值1/1/2009 1:23:11.000(我知道你真的不能忽略毫秒值與日期,只是希望它爲零)。在日期中省略毫秒

在SQL Server中是否有這樣的功能?或者我必須寫我自己的功能?同樣,我不希望它是varchar類型,而是datetime類型。

回答

9

如果你不想使用字符串轉換,這裏有一個解決方案:

DECLARE @TheDate datetime, @Today datetime 
SET @TheDate = GetDate() 

SET @Today = DateAdd(dd, DateDiff(dd, 0, @TheDate), 0) 
SELECT DateAdd(s, DateDiff(s, @Today, @TheDate), @Today) 
+0

這個工作完美無需舍入秒。幫助過我。謝謝:) – 2014-08-01 01:12:03

+0

對於那些正在尋找答案沒有毫秒的部分,那麼這不適合你,這在毫秒時給'000',你可以嘗試@Peter Radocchia的方法。如果你對'000'還好,這對你來說是完美的。 但是越乾淨越好 – Gaurravs 2016-09-20 11:03:33

4
SELECT GETDATE(), 
     CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120) 
+0

是不是'120'在最外層的CONVERT冗餘? – 2010-02-11 18:32:13

+0

@OMGPonies:讓我們互相贊成:) – Quassnoi 2010-02-11 18:34:22

+0

將字符串轉換爲日期時間時,將忽略CONVERT格式樣式(120)。 BOL說:_用於將datetime或smalldatetime數據轉換爲字符數據(nchar,nvarchar,char,varchar,nchar或nvarchar數據類型)的日期格式樣式;或用於將float,real,money或smallmoney數據轉換爲字符數據(nchar,nvarchar,char,varchar,nchar或nvarchar數據類型)的字符串格式。當樣式爲NULL時,返回的結果也是NULL._ – 2010-02-11 18:50:34

10

用途:

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(19), GETDATE(), 120)) 

此:

CONVERT(VARCHAR(19), GETDATE(), 120) 

...省略毫秒,返回VARCHAR。因此,您將CAST/CONVERT轉換爲DATETIME以便使用所需的數據類型。

請參閱this link for a list of various date/time formats you can work with

+0

將數字轉換爲字符串,然後再返回效率非常低。使用SQL中提供的日期時間函數 – TFD 2010-02-11 23:39:09

6

試試這個

declare @DATE datetime 
select @DATE = '1/1/2009 1:23:11.923' 



SELECT convert(datetime,CONVERT(char(35),@DATE,120)) 

或日期函數只

DECLARE @DATE DATETIME 
SELECT @DATE = '1/1/2009 1:23:11.923' 

SELECT DATEADD(SECOND, DATEDIFF(SECOND, 39000, @DATE), 39000) 
+0

將數字轉換爲字符串,然後再返回效率非常低。使用SQL – TFD 2010-02-11 23:40:36

+0

中提供的日期時間函數,您將得到一個以毫秒爲單位的溢出 – SQLMenace 2010-02-11 23:48:31

+1

您所要做的就是減去毫秒w/DATEADD()。不需要從0開始添加。 – 2010-02-12 00:14:46

2
DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0) 

可能需要將0改爲別的東西來防止溢出錯誤。目前沒有SQL Server在驗證。

雖然這種方法似乎並不直觀一見鍾情,看看這裏它背後的理由:http://www.karaszi.com/SQLServer/info_datetime.asp#GettingRidOfTimePortion

編輯:看評論

+0

弗蘭克,我想你想SECOND,而不是MILLISECOND。 – 2010-02-11 23:31:06

+0

哈哈。好,亞倫。改變了它。 – 2010-02-12 07:09:13

43

使用DATETIME2,在SQL Server 2008中的新數據類型支持小數精度:

SELECT 
    CONVERT(DATETIME2(0),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss] 
, CONVERT(DATETIME2(1),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.f] 
, CONVERT(DATETIME2(2),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ff] 
, CONVERT(DATETIME2(3),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fff] 
, CONVERT(DATETIME2(4),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffff] 
, CONVERT(DATETIME2(5),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffff] 
, CONVERT(DATETIME2(6),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffffff] 
, CONVERT(DATETIME2(7),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffffff] 

轉換將舍入到最接近的單位,例如:

2014-09-04 09:35:47.0162993 as DATETIME2(4) -> 
2014-09-04 09:35:47.0163 

可替換地,在SQL 2005和早期的教:

SELECT 
    original = GETDATE() 
, [floor] = DATEADD(ms,-DATEPART(ms,GETDATE()),GETDATE()) 
, [ceiling] = DATEADD(ms,1000-DATEPART(ms,GETDATE()),GETDATE()) 
, [rounded] = DATEADD(ms,CASE WHEN DATEPART(ms,GETDATE()) < 500 THEN 0 ELSE 1000 END-DATEPART(ms,GETDATE()),GETDATE()) 

這比轉換到和從一個字符串表示有點快。

+1

哇,這太好了,但不幸的是,SQL Server 2005 :-( – 2010-02-11 21:45:24

+0

添加了SQL 2005版本。 – 2010-02-11 21:56:54

+1

Brian,我刪除了SQL Server 2008標記,如果您需要一個只能在2005年使用的解決方案,那麼您不應該使用不正確的版本來標記 – 2010-02-11 23:28:49