從SQL Server中選擇時,我想獲取日期,但省略了毫秒值,並且希望將其作爲日期類型。所以如果我有一個值1/1/2009 1:23:11.923
,我想省略毫秒,但保留日期類型,所以它將是值1/1/2009 1:23:11.000
(我知道你真的不能忽略毫秒值與日期,只是希望它爲零)。在日期中省略毫秒
在SQL Server中是否有這樣的功能?或者我必須寫我自己的功能?同樣,我不希望它是varchar
類型,而是datetime
類型。
從SQL Server中選擇時,我想獲取日期,但省略了毫秒值,並且希望將其作爲日期類型。所以如果我有一個值1/1/2009 1:23:11.923
,我想省略毫秒,但保留日期類型,所以它將是值1/1/2009 1:23:11.000
(我知道你真的不能忽略毫秒值與日期,只是希望它爲零)。在日期中省略毫秒
在SQL Server中是否有這樣的功能?或者我必須寫我自己的功能?同樣,我不希望它是varchar
類型,而是datetime
類型。
如果你不想使用字符串轉換,這裏有一個解決方案:
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)
SELECT GETDATE(),
CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
是不是'120'在最外層的CONVERT冗餘? – 2010-02-11 18:32:13
@OMGPonies:讓我們互相贊成:) – Quassnoi 2010-02-11 18:34:22
將字符串轉換爲日期時間時,將忽略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
用途:
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。
將數字轉換爲字符串,然後再返回效率非常低。使用SQL中提供的日期時間函數 – TFD 2010-02-11 23:39:09
試試這個
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)
DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)
可能需要將0改爲別的東西來防止溢出錯誤。目前沒有SQL Server在驗證。
雖然這種方法似乎並不直觀一見鍾情,看看這裏它背後的理由:http://www.karaszi.com/SQLServer/info_datetime.asp#GettingRidOfTimePortion
編輯:看評論
弗蘭克,我想你想SECOND,而不是MILLISECOND。 – 2010-02-11 23:31:06
哈哈。好,亞倫。改變了它。 – 2010-02-12 07:09:13
使用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())
這比轉換到和從一個字符串表示有點快。
哇,這太好了,但不幸的是,SQL Server 2005 :-( – 2010-02-11 21:45:24
添加了SQL 2005版本。 – 2010-02-11 21:56:54
Brian,我刪除了SQL Server 2008標記,如果您需要一個只能在2005年使用的解決方案,那麼您不應該使用不正確的版本來標記 – 2010-02-11 23:28:49
從日期減去毫秒。 (或加毫秒的負值)
SELECT DATEADD(ms, -DATEPART(ms, GETDATE()), GETDATE())
這個工作完美無需舍入秒。幫助過我。謝謝:) – 2014-08-01 01:12:03
對於那些正在尋找答案沒有毫秒的部分,那麼這不適合你,這在毫秒時給'000',你可以嘗試@Peter Radocchia的方法。如果你對'000'還好,這對你來說是完美的。 但是越乾淨越好 – Gaurravs 2016-09-20 11:03:33