我需要将datetime变量设置为两天,但是时间部分必须是18:00。
例如,如果我现在拨打getdate()
,我将获得2010-05-17 13:18:07.260
。我需要将其设置为2010-05-19 18:00:00.000
。
是否有人有一个很好的片段或任何想法如何做到这一点?
答案 0 :(得分:18)
SELECT DATEADD(hh, 24 * 2 + 18, DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0))
这会截断当前日期,并为其添加2天18小时。{/ 1}。
可能的变化:
(24 * 2 + 18)
答案 1 :(得分:2)
我必须做类似的事情,创建一个程序,从前一天的某个时间运行到当天的某个时间 这就是我在前一天将开始日期设置为16:30所做的,基本上减去你不想让它们回到0的部分,然后添加你想要它的值。
-- Set Start Date to previous day and set start time to 16:30.00.000
SET @StartDate = GetDate()
SET @StartDate = DateAdd(dd,- 1, @StartDate)
SET @StartDate = DateAdd(hh,- (DatePart(hh,@StartDate))+16, @StartDate)
SET @StartDate = DateAdd(mi,- (DatePart(mi,@StartDate))+30, @StartDate)
SET @StartDate = DateAdd(ss,- (DatePart(ss,@StartDate)), @StartDate)
SET @StartDate = DateAdd(ms,- (DatePart(ms,@StartDate)), @StartDate)
希望这有助于某人。
答案 2 :(得分:1)
Select DateAdd(hour, 18, DateAdd(day, 2, cast(floor(cast(getdate() as float))as datetime)))
答案 3 :(得分:1)
简而言之,答案是......
DECLARE @MyDate DATETIME = DATEADD(HOUR, 18, CONVERT(DATETIME, CONVERT(DATE, GETDATE()+2))) [6pm Today]
它可能看起来很复杂,但相信我,当我说它看起来比实际情况要糟糕得多。
将每个函数调用解释为上述查询的一系列步骤如下:
GETDATE()
:将当前日期和时间作为DATETIME
值。+2
:添加两天,因为DATETIME校准中的每个整数代表一天,分数代表一天的分数。CONVERT(DATE,@REF)
:转换为日期格式(删除时间元素)CONVERT(DATETIME,@REF)
:转换回DateTime(时间元素默认为午夜00:00)DATEADD(HOUR,@NUM,@REF)
:加12 + 6 = 18小时,下午6点注意:
更改@MyDate
以反映您自己变量的名称,同时记住变量的前缀为@
。
可以通过在=
函数中的[6pm Today]
和DATEADD(YEAR,@NUM,@REF)
之间包装查询来添加年份。
=
函数中的[6pm Today]
和DATEADD(MONTH,@NUM,@REF)
之间包装查询来添加月份。=
函数中的[6pm Today]
和DATEADD(MINUTE,@NUM,@REF)
之间包装查询来添加分钟。=
函数中的[6pm Today]
和DATEADD(SECOND,@NUM,@REF)
之间包装查询来添加秒数。可以通过在=
函数中的[6pm Today]
和DATEADD(MILLISECOND,@NUM,@REF)
之间包装查询来添加毫秒数。
我个人避免DATEDIFF
函数,因为它返回一个32位的int,它经常溢出,因为DateTime
值类型在内部存储为64位值,并用值范围表示日期和时间从公元前1月1日00:00:00(午夜),Anno Domini(公共时代)到公元9999年12月31日晚上11:59:59,公历(公元9月)。
我使用CONVERT
代替CAST
,因为CAST
调用CONVERT
函数。它可能对执行时间几乎没有任何影响,但如果确实如此,则直接调用CONVERT
是有意义的。
查询中的空格几乎是可选的。
答案 4 :(得分:0)
有点晚但仍然是一个有用的例子:
declare
@dt datetime = getutcdate()
,@hour tinyint = 18;
select
@dt as dt
,DATEPART(hour, @dt) as hour_of_day
,DATEADD(hour, -1*DATEPART(hour, @dt), @dt) as hour_00_of_day
,DATEADD(hour, -1*DATEPART(hour, @dt),
DATEADD(minute, -1*DATEPART(minute, @dt),
DATEADD(second, -1*DATEPART(second, @dt),
DATEADD(millisecond, -1*DATEPART(millisecond, @dt), @dt)))) as beginning_of_day
,DATEADD(hour, @hour,
DATEADD(hour, -1*DATEPART(hour, @dt),
DATEADD(minute, -1*DATEPART(minute, @dt),
DATEADD(second, -1*DATEPART(second, @dt),
DATEADD(millisecond, -1*DATEPART(millisecond, @dt), @dt))))
) as hour_18_of_day
通常作为一种功能:
-- =============================================
-- Description: Set datetime part (NULL to keep as is)
-- =============================================
-- SELECT GETUTCDATE() AS DT, [dbo].[udf_datetime_SET_DATE_TIME_PART] (GETUTCDATE(), 1985, 11, 19, 12, 01, 02, 0)
-- SELECT GETUTCDATE() AS DT, [dbo].[udf_datetime_SET_DATE_TIME_PART] (GETUTCDATE(), NULL, NULL, NULL, 12, NULL, NULL, NULL)
CREATE FUNCTION [dbo].[fn_datetime_SET_DATE_TIME_PART]
(
@dt DATETIME
,@YEAR INT = NULL
,@MONTH INT = NULL
,@DAY_OF_MONTH INT = NULL
,@HOUR INT = NULL
,@MINUTE INT = NULL
,@SECOND INT = NULL
,@MILLISECOND INT = NULL
)
RETURNS DATETIME
AS
BEGIN
IF @dt IS NULL
RETURN @dt
SET @dt = IIF(@YEAR IS NULL
,@dt
,DATEADD(year, -1*DATEPART(year, @dt) + @YEAR, @dt)
)
SET @dt = IIF(@MONTH IS NULL
,@dt
,DATEADD(month, -1*DATEPART(month, @dt) + @MONTH, @dt)
)
SET @dt = IIF(@DAY_OF_MONTH IS NULL
,@dt
,DATEADD(day, -1*DATEPART(day, @dt) + @DAY_OF_MONTH, @dt)
)
SET @dt = IIF(@HOUR IS NULL
,@dt
,DATEADD(hour, -1*DATEPART(hour, @dt) + @HOUR, @dt)
)
SET @dt = IIF(@MINUTE IS NULL
,@dt
,DATEADD(minute, -1*DATEPART(minute, @dt) + @MINUTE, @dt)
)
SET @dt = IIF(@SECOND IS NULL
,@dt
,DATEADD(second, -1*DATEPART(second, @dt) + @SECOND, @dt)
)
SET @dt = IIF(@MILLISECOND IS NULL
,@dt
,DATEADD(millisecond, -1*DATEPART(millisecond, @dt) + @MILLISECOND, @dt)
)
RETURN @dt
END