在SQL Server中,如何将日期时间设置为秒/分钟/小时/日/年?
假设我有一个日期为2008-09-17 12:56:53.430,那么地板的输出应该是:
2008-01-01 00:00:00.000
发布于 2008-09-17 17:01:37
关键是使用DATEADD和DATEDIFF以及适当的SQL timespan枚举。
declare @datetime datetime;
set @datetime = getdate();
select @datetime;
select dateadd(year,datediff(year,0,@datetime),0);
select dateadd(month,datediff(month,0,@datetime),0);
select dateadd(day,datediff(day,0,@datetime),0);
select dateadd(hour,datediff(hour,0,@datetime),0);
select dateadd(minute,datediff(minute,0,@datetime),0);
select dateadd(second,datediff(second,'2000-01-01',@datetime),'2000-01-01');
select dateadd(week,datediff(week,0,@datetime),-1); --Beginning of week is Sunday
select dateadd(week,datediff(week,0,@datetime),0); --Beginning of week is Monday
请注意,当您按秒绘制地板时,如果使用0,则通常会出现算术溢出。因此,请选择一个已知的值,确保该值将低于您试图填充的datetime。
发布于 2008-09-17 19:08:32
在SQL Server中,有一个小技巧可以做到这一点:
SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)
将DateTime转换为浮点数,浮点数将日期表示为整数部分,将时间表示为经过的一天的小数部分。去掉小数部分,然后把它转换成DateTime,你就得到了当天开始的午夜。
这可能比所有的DATEADD和DATEDIFF更有效。这当然更容易打字。
发布于 2012-04-18 23:20:00
在转换/转换解决方案的基础上扩展,在Microsoft SQL Server 2008中,您可以执行以下操作:
cast(cast(getdate() as date) as datetime)
只需将getdate()
替换为任何datetime列即可。
此转换中不涉及任何字符串。
这对于即席查询或更新是可以的,但是对于键连接或频繁使用的处理,在处理过程中处理转换或重新定义表以具有适当的键和数据可能更好。
在2005年,您可以使用更混乱的地板:cast(floor(cast(getdate() as float)) as datetime)
我也不认为它使用字符串转换,但我不能比较实际效率和纸上谈兵的估计。
https://stackoverflow.com/questions/85373
复制相似问题