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))