在SQL Server 2008中截断日期时间值(如删除小时、分钟和秒)的最佳方法是什么?
例如:
declare @SomeDate datetime = '2009-05-28 16:30:22'
select trunc_date(@SomeDate)
-----------------------
2009-05-28 00:00:00.000
在SQL Server 2008中截断日期时间值(如删除小时、分钟和秒)的最佳方法是什么?
例如:
declare @SomeDate datetime = '2009-05-28 16:30:22'
select trunc_date(@SomeDate)
-----------------------
2009-05-28 00:00:00.000
当前回答
对于那些来到这里寻找一种方法来截断一个DATETIME字段小于一天,例如每分钟,你可以使用这个:
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) + (FLOOR((CAST(GETDATE() AS FLOAT) - FLOOR(CAST(GETDATE() AS FLOAT))) * 1440.0) + (3.0/86400000.0)) / 1440.0 AS DATETIME)
因此,如果今天是2010-11-26 14:54:43.123,那么这个将返回2010-11-26 14:54:00.000。
要更改它的运行时间间隔,请将1440.0替换为一天中的间隔数,例如:
24hrs = 24.0 (for every hour)
24hrs / 0.5hrs = 48.0 (for every half hour)
24hrs / (1/60) = 1440.0 (for every minute)
(总是在末尾加上。0以隐式转换为浮点数。)
对于那些想知道(3.0/86400000)在我的计算中是用来做什么的人来说,SQL Server 2005似乎并没有准确地从FLOAT转换为DATETIME,所以这增加了3毫秒。
其他回答
Oracle:
TRUNC(SYSDATE, 'MONTH')
SQL服务器:
DATEADD(DAY, - DATEPART(DAY, DateField) + 1, DateField)
可以类似地用于从日期截断分钟或小时。
仅适用于SQL Server 2008
CAST(@SomeDateTime AS Date)
然后将其转换回datetime
CAST(CAST(@SomeDateTime AS Date) As datetime)
你可以这样做(SQL 2008):
@SomeDate date = getdate()
select @SomeDate
2009-05-28
在SQl 2005中,你的trunc_date函数可以这样写。
(1)
CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
CAST(FLOOR( CAST( @date AS FLOAT ) )AS DATETIME)
END
第一种方法要干净得多。它只使用3个方法调用,包括最后的CAST(),并且不执行字符串连接,这是一个自动加。此外,这里没有大型类型强制转换。如果您可以想象可以表示日期/时间戳,那么从日期转换到数字再转换回日期是一个相当简单的过程。
(2)
CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
SELECT CONVERT(varchar, @date,112)
END
如果你担心微软的datetimes(2)或(3)的实现可能是好的。
(3)
CREATE FUNCTION trunc_date(@date DATETIME)
RETURNS DATETIME
AS
BEGIN
SELECT CAST((STR( YEAR( @date ) ) + '/' +STR( MONTH( @date ) ) + '/' +STR( DAY(@date ) )
) AS DATETIME
END
第三,更详细的方法。这需要将日期分解为年、月和日部分,以“yyyy/mm/dd”格式将它们组合在一起,然后将其转换为日期。该方法涉及7个方法调用,包括最后的CAST(),更不用说字符串连接了。
对于那些来到这里寻找一种方法来截断一个DATETIME字段小于一天,例如每分钟,你可以使用这个:
SELECT CAST(FLOOR(CAST(GETDATE() AS FLOAT)) + (FLOOR((CAST(GETDATE() AS FLOAT) - FLOOR(CAST(GETDATE() AS FLOAT))) * 1440.0) + (3.0/86400000.0)) / 1440.0 AS DATETIME)
因此,如果今天是2010-11-26 14:54:43.123,那么这个将返回2010-11-26 14:54:00.000。
要更改它的运行时间间隔,请将1440.0替换为一天中的间隔数,例如:
24hrs = 24.0 (for every hour)
24hrs / 0.5hrs = 48.0 (for every half hour)
24hrs / (1/60) = 1440.0 (for every minute)
(总是在末尾加上。0以隐式转换为浮点数。)
对于那些想知道(3.0/86400000)在我的计算中是用来做什么的人来说,SQL Server 2005似乎并没有准确地从FLOAT转换为DATETIME,所以这增加了3毫秒。