如果我有一个日期值 2010-03-01 17:34:12.018
将此转化为最有效的方法是什么2010-03-01 00:00:00.000
?
作为次要问题,模拟Oracle TRUNC
功能的最佳方法是什么,这将允许您截断年,季,月,周,日,小时,分钟和第二边界?
And*_*mar 32
为了四舍五入到最近的一整天,有三种方法被广泛使用.第一个用于datediff
查找自0
datetime 以来的天数.该0
日期时间对应于1900年1月1日起,通过加入天差开始日期,你四舍五入到一整天;
select dateadd(d, 0, datediff(d, 0, getdate()))
Run Code Online (Sandbox Code Playgroud)
第二种方法是基于文本的:它截断文本描述varchar(10)
,只留下日期部分:
select convert(varchar(10),getdate(),111)
Run Code Online (Sandbox Code Playgroud)
第三种方法使用的事实是a实际上datetime
是一个浮点,表示自1900年以来的天数.因此,通过将其舍入为整数,例如使用floor
,您将得到当天的开始:
select cast(floor(cast(getdate() as float)) as datetime)
Run Code Online (Sandbox Code Playgroud)
要回答你的第二个问题,本周开始比较棘手.一种方法是减去星期几:
select dateadd(dd, 1 - datepart(dw, getdate()), getdate())
Run Code Online (Sandbox Code Playgroud)
这也会返回一个时间部分,因此您必须将其与其中一个时间剥离方法结合使用才能到达第一个日期.例如,@start_of_day
作为可读性的变量:
declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)
Run Code Online (Sandbox Code Playgroud)
年,月,小时和分钟的开头仍然适用于"自1900年以来的差异"方法:
select dateadd(yy, datediff(yy, 0, getdate()), 0)
select dateadd(m, datediff(m, 0, getdate()), 0)
select dateadd(hh, datediff(hh, 0, getdate()), 0)
select dateadd(mi, datediff(mi, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)
舍入为秒需要采用不同的方法,因为自那以后的秒数0
会产生溢出.一种方法是使用当天的开始而不是1900作为参考日期:
declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)
Run Code Online (Sandbox Code Playgroud)
要舍入5分钟,请调整分钟舍入方法.取微小差异的商,例如使用/5*5
:
select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)
Run Code Online (Sandbox Code Playgroud)
这也适用于四分之一小时.
Red*_*ter 15
如果您使用的是SQL Server 2008,则可以使用如下所示的新Date
数据类型:
select cast(getdate() as date)
Run Code Online (Sandbox Code Playgroud)
如果仍需要将值作为DateTime
数据类型,则可以执行以下操作:
select cast(cast(getdate() as date) as datetime)
Run Code Online (Sandbox Code Playgroud)
应该适用于所有版本的SQL Server的方法是:
select cast(floor(cast(getdate() as float)) as datetime)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
52583 次 |
最近记录: |