如何将包含毫秒的日期时间缩短为仅包含秒?
例如,将2012-01-25 17:24:05.784
转换为2012-01-25 17:24:05
这将截断毫秒部分。
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)
最快、同时也是语言安全和确定性最高的
DATEADD(second, DATEDIFF(second, '20000101', getdate()), '20000101')
@gbn
这是给你的博客文章 :). 改掉的坏习惯。 - Mikael Eriksson现在最简单的方式是:
select convert(datetime2(0) , getdate())
convert(datetime, convert(varchar, @datetime_var, 120), 120)
select cast(yourdate as smalldatetime) from yourtable
编辑:
以下脚本旨在比较Mikael和gbn的脚本,我都点赞了因为两个答案都很棒。测试结果表明,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
smalldatetime
截断到分钟。 (不确定我是否说得准确,也许我应该说它会四舍五入到分钟)。请参见(http://msdn.microsoft.com/en-us/library/bb677243.aspx)中的示例。不想对您进行投反对票,因为这是我尝试的内容,所以乍一看它*看起来*像是正确的答案 - 所以可以保留这个回答。 - Kyle Brandtselect datediff(ms, @mikael, @gbn) gbn, datediff(ms, @gbn, getdate()) mikael
- Mikael Erikssondeclare @dt datetime2
set @dt = '2019-09-04 17:24:05.784'
select convert(datetime2(0), @dt)
2012-01-25 17:24:05.784
转换为2012-01-25 17:24:05
,而这个答案会得到2012-01-25 17:24:06
。 - Josh GallagherSELECT CAST( LEFT( '2018-07-19 11:59:59.999' , 19 ) AS DATETIME2(0) )
--- DOES NOT Truncate milliseconds
--- 2018-07-19 12:00:00.000
SELECT CONVERT(DATETIME, '2018-07-19 11:59:59.999')
--- Truncate milliseconds
--- 2018-07-19 11:59:59.000
SELECT CONVERT(DATETIME, CONVERT(CHAR(19), '2018-07-19 11:59:59.999', 126))
--- Current Date Time with milliseconds truncated
SELECT CONVERT(DATETIME, CONVERT(CHAR(19), GETDATE(), 126))
在 @Mikael Eriksson 的回答基础上进行扩展:
要将 datetime2(7) 截断为 3 位(即毫秒):
-- Strip of fractional part then add desired part back in
select dateadd(nanosecond,
-datepart(nanosecond, TimeUtc) + datepart(millisecond, TimeUtc) * 1e6,
TimeUtc) as TimeUtc
目前datetime2(p)的最大精度为(7) (来自learn.microsoft.com)
DATEDIFF(SECONDS ...)
小于1的位置更有意义。 - bambams