在SQL Server中设置日期

时间:2020-03-05 18:59:24  来源:igfitidea点击:

在SQL Server中,如何将DATETIME"设置"到秒/分钟/小时/天/年?

假设我的日期为2008-09-17 12:56:53.430,那么Flooring的输出应为:

  • 年份:2008-01-01 00:00:00.000
  • 月:2008-09-01 00:00:00.000
  • 日期:2008-09-17 00:00:00.000
  • 时间:2008-09-17 12:00:00.000
  • 分钟:2008-09-17 12:56:00.000
  • 第二名:2008-09-17 12:56:53.000

解决方案

回答

关键是使用DATEADD和DATEDIFF以及适当的SQL时间跨度枚举。

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,通常会出现算术溢出。因此,请选择一个已知值,该值一定要小于我们要底线的日期时间。

回答

根据我们使用的样式,CONVERT()函数也可以执行此操作。

回答

不幸的是它不是Oracle,否则我们可以使用trunc()或者to_char()。

但是我在使用SQL Server时遇到了类似的问题,并使用了CONVERT()和DateDiff()方法,如此处所引用

回答

在SQL Server中,有一些技巧可以做到这一点:

SELECT CAST(FLOOR(CAST(CURRENT_TIMESTAMP AS float)) AS DATETIME)

我们将DateTime转换为一个浮点数,该浮点数将Date表示为整数部分,并将Time表示为经过的一天的一部分。切掉该小数部分,然后将其强制转换回DateTime,那一天的开始就是午夜。

这可能比所有DATEADD和DATEDIFF东西更有效。这肯定是更容易键入的方式。

回答

由于PostgreSQL也是" SQL Server",因此我将提及

date_trunc()

哪一个恰好符合要求。

例如:

select date_trunc('hour',current_timestamp);
       date_trunc
------------------------
 2009-02-18 07:00:00-08
(1 row)