将datetime变量的时间部分设置为18:00

时间:2010-05-17 09:21:02

标签: sql sql-server datetime

我需要将datetime变量设置为两天,但是时间部分必须是18:00。

例如,如果我现在拨打getdate(),我将获得2010-05-17 13:18:07.260。我需要将其设置为2010-05-19 18:00:00.000

是否有人有一个很好的片段或任何想法如何做到这一点?

5 个答案:

答案 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]

它可能看起来很复杂,但相信我,当我说它看起来比实际情况要糟糕得多。

将每个函数调用解释为上述查询的一系列步骤如下:

  1. GETDATE():将当前日期和时间作为DATETIME值。
  2. +2:添加两天,因为DATETIME校准中的每个整数代表一天,分数代表一天的分数。
  3. CONVERT(DATE,@REF):转换为日期格式(删除时间元素)
  4. CONVERT(DATETIME,@REF):转换回DateTime(时间元素默认为午夜00:00)
  5. DATEADD(HOUR,@NUM,@REF):加12 + 6 = 18小时,下午6点
  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