Tsql 在T-SQL中将日期时间截断为秒(删除毫秒)

Tsql 在T-SQL中将日期时间截断为秒(删除毫秒),tsql,datetime,Tsql,Datetime,将包含毫秒的日期时间缩短为只有秒的最佳方法是什么 例如,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)) 或 以下功能的性能非常快,但它不仅可以消除毫秒,还可以舍入到分钟。看见http://msdn.microsoft.com/e

将包含毫秒的日期时间缩短为只有秒的最佳方法是什么


例如,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))


以下功能的性能非常快,但它不仅可以消除毫秒,还可以舍入到分钟。看见http://msdn.microsoft.com/en-us/library/bb677243.aspx

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
----------- -----------
5286        4883
第三轮

mikael      gbn
----------- -----------
5346        4620
最快的,也是语言安全和确定性的

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

现在最简单的方法是:

select convert(datetime2(0) , getdate())

根据@Mikael Eriksson接受的答案展开:

要将datetime27截断为3个位置(即毫秒),请执行以下操作:

   -- Strip of fractional part then add desired part back in
   select dateadd(nanosecond,
                  -datepart(nanosecond, TimeUtc) + datepart(millisecond, TimeUtc) * 1e6,
                  TimeUtc) as TimeUtc

datetime2p的当前最大精度为7,从

smalldatetime截断到分钟。我不确定我说的是否完全正确,也许我应该说它一直持续到最后一分钟。请参见中的示例。我不想投你反对票,因为这是我尝试过的,所以乍一看这似乎是正确的答案——所以离开这个可能会有帮助。你是对的,我的坏朋友。smalldatetime显示秒数,但始终为0。这样更公平。选择datediffms、@mikael、@gbn gbn、datediffms、@gbn、getdatemikael@MikaelEriksson我把考试搞砸了。现在它已经被更正。今天运行这个测试给了我相反的结果:mikael:2426 gbn:2950//mikael:2400 gbn:2963//mikael:2450 gbn:3010A很好的选项,但是我必须将它转换回来,因为我不确定如何调用您的示例,因为现在不是1970年-unix时代拥有人类可读的时间戳。我使用2000来避免整数溢出。如果你愿意,你可以用19700101。这确实很快。问题是它返回了错误的结果。也许如果你把dd换成second@t-clausen.dk:如果有明显的拼写错误,请随意编辑我的答案:-@t-clausen.dk-不在我的测试中。cast版本的速度慢了三倍,dateadd版本与我的版本相似,但速度稍快一些@gbn以下是您的博客帖子:。更简洁的是:CASTCONVERTVARCHAR,@date,120作为DATETIMESide注意:在我的例子中,我对比较日期非常感兴趣,但为了找到模糊的匹配记录,忽略了微小的差异。找到DateDiff的位置更有意义。。。小于1。对于那些稍后查看此答案的人……您可能会在这里遇到问题。例如:选择CONVERTDATETIME20,'2018-07-19 11:59:59.999'第二个解决方案,减去毫秒,非常简单。
convert(datetime, convert(varchar, @datetime_var, 120), 120)
select convert(datetime2(0) , getdate())
declare @dt datetime2
set @dt = '2019-09-04 17:24:05.784' 
select convert(datetime2(0), @dt)
   -- Strip of fractional part then add desired part back in
   select dateadd(nanosecond,
                  -datepart(nanosecond, TimeUtc) + datepart(millisecond, TimeUtc) * 1e6,
                  TimeUtc) as TimeUtc
--- 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))