在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
当前回答
在使用分析时,您可能需要大量的日期\时间截断。所以我做了一个小函数来帮助整理:
CREATE FUNCTION TRUNC_DATE
(
@datetime datetime, -- datetime to be truncated
@level VARCHAR(10) -- truncation level: year, month, day, hour and minute
)
RETURNS DATETIME
AS
BEGIN
IF (UPPER(@level) = 'YEAR')
RETURN DATEADD(YEAR, DATEDIFF(YEAR, 0, @datetime), 0)
ELSE IF (UPPER(@level) = 'MONTH')
RETURN DATEADD(MONTH, DATEDIFF(MONTH, 0, @datetime), 0)
ELSE IF(UPPER(@level) = 'DAY')
RETURN DATEADD(DAY, DATEDIFF(DAY, 0, @datetime), 0)
ELSE IF (UPPER(@level) = 'HOUR')
RETURN DATEADD(HOUR, DATEDIFF(HOUR, 0, @datetime), 0)
ELSE IF (UPPER(@level) = 'MINUTE')
RETURN DATEADD(MINUTE, DATEDIFF(MINUTE, 0, @datetime), 0)
RETURN @datetime
END
GO
计算函数(用you列更改GETDATE()):
SELECT DBO.TRUNC_DATE(GETDATE(), 'YEAR') YEAR;
SELECT DBO.TRUNC_DATE(GETDATE(), 'MONTH') YEAR_MONTH;
SELECT DBO.TRUNC_DATE(GETDATE(), 'DAY') YEAR_MONTH_DAY;
SELECT DBO.TRUNC_DATE(GETDATE(), 'HOUR') YEAR_MONTH_DAY_HOUR;
SELECT DBO.TRUNC_DATE(GETDATE(), 'MINUTE') YEAR_MONTH_DAY_HOUR_MINUTE;
输出:
其他回答
你可以这样做(SQL 2008):
@SomeDate date = getdate()
select @SomeDate
2009-05-28
为了得到更完整的答案,这里有一种截断到任何日期部分的工作方法,包括分钟(用要截断的日期替换GETDATE())。
这与公认的答案不同,因为你不仅可以使用dd (days),还可以使用任何日期部分(见这里):
dateadd(minute, datediff(minute, 0, GETDATE()), 0)
注意,在上面的表达式中,0是一年开始时的一个常数日期(1900-01-01)。如果需要截断为更小的部分,例如秒或毫秒,则需要取一个更接近要截断的日期的常数日期,以避免溢出。
对于那些来到这里寻找一种方法来截断一个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毫秒。
当我不得不这样做时,我在网上找到的片段是:
dateadd(dd,0, datediff(dd,0, YOURDATE))
e.g.
dateadd(dd,0, datediff(dd,0, getDate()))
这个查询应该会给出与Oracle中的trunc(sysdate)相同的结果。
SELECT *
FROM your_table
WHERE CONVERT(varchar(12), your_column_name, 101)
= CONVERT(varchar(12), GETDATE(), 101)
希望这能有所帮助!