【问题标题】:Set time portion of a datetime variable设置日期时间变量的时间部分
【发布时间】:2019-02-14 13:13:48
【问题描述】:

我正在处理一项将成为自动化工作的查询。它需要查找最后一天晚上 8 点到晚上 8 点之间的所有交易。我正在考虑做这样的事情

DECLARE @start_date DATETIME
DECLARE @end_date DATETIME

SET @start_date = DATEADD(DAY, -2, GETDATE())
SET @end_date = DATEADD(DAY, -1, GETDATE())

对于自动查询,这很适合找出日期部分。但变量的 TIME 部分是查询执行的当前时间。有没有一种快速简单的方法将两个变量的时间部分硬编码为晚上 8:00?

【问题讨论】:

  • +1 我在cyberkiwi 的回答中看到了解决这个问题的新方法,如果没有你的问题,我不会去的。谢谢! =)

标签: sql sql-server tsql datetime


【解决方案1】:
DECLARE @start_date DATETIME
DECLARE @end_date DATETIME

SET @start_date = DATEADD(hour, 20, DATEDIFF(DAY, 2, GETDATE()))
SET @end_date = @start_date + 1

select @start_date, @end_date

【讨论】:

  • 小心这个。如果两天前属于不同的月份,尤其是上个月有 31 天或 28 天时,它可能不会给出正确的结果。
  • @Delphi.Boy 你知道你可以轻松测试吗?将 GETDATE() 更改为 '2016-11-01 12:34' 满足您的“两天前属于不同月份”条件并检查结果。
【解决方案2】:

这也可以:

DECLARE @start_date datetime
DECLARE @end_date datetime

SET @start_date = LEFT(CONVERT(nvarchar, DATEADD(DAY, -2, GETDATE()), 120), 11) + N'20:00:00'
SET @end_date = @start_date + 1

select @start_date, @end_date

虽然cyberkiwi的回答很聪明! =)

【讨论】:

  • 赞成,因为这种方法可以很容易地一次设置时间部分的所有部分。我的要求是将时间设置为 23:59:59(将结束时间传递到存储过程中) SET @start_date = LEFT(CONVERT(VARCHAR,@start_date,121),10) + '23:59:59'
【解决方案3】:

我需要从数据库中提取一个日期并将 3:00 Pm 附加到它。我是这样做的

select dateadd(hour, 15, datediff(day, 0, myDatabaseDate)) 
from dbo.myDatabaseTable
where myDatabaseId = 1

它返回的结果是2017-10-01 15:00:00.000。数据库中的日期是2017-10-01。我提出的解决方案是保留当前日期。我在现有日期上增加了 0 天。我给了它 15:00 小时,它就像一个魅力。

【讨论】:

    【解决方案4】:
    DECLARE @start_date DATETIME = DATEADD(HOUR, 20, DATEADD(MINUTE, 00, CONVERT(DATETIME, CONVERT(DATE, GETDATE())))) - 2
    DECLARE @end_date DATETIME = DATEADD(HOUR, 20, DATEADD(MINUTE, 00, CONVERT(DATETIME, CONVERT(DATE, GETDATE())))) - 1
    

    注意事项:

    • GETDATE() + X 相当于 DATEADD(DAY, X, GETDATE())
    • DATEIME 转换为DATE,然后再转换回DATETIME,将时间设置为午夜,即00:00:00.000
    • 单独的SETDECLARE 语句是不必要的,但为了以防以后有帮助,变量也可以设置为SELECT 语句的一部分。

    【讨论】:

      【解决方案5】:

      如果只是更新日期时间的特定部分,您可以使用SMALLDATETIMEFROMPARTS,例如:

      UPDATE MyTable 
      SET MyDate = SMALLDATETIMEFROMPARTS(YEAR(MyDate), MONTH(MyDate), DAY(MyDate),YEAR(MyDate), <HoursValue>, <MinutesValue>) 
      

      在其他情况下,可能需要将部分日期时间复制到其他部分或仅更新日期时间的某些部分:

      UPDATE MyTable 
      SET MyDate = SMALLDATETIMEFROMPARTS(YEAR(MyDate), MONTH(MyDate), DAY(MyDate),YEAR(MyDate), DATEPART(hour, MyDate), DATEPART(minute, MyDate)) 
      

      更多此类功能请参考SQL Server Date/Time related API references

      【讨论】:

        【解决方案6】:

        我必须做类似的事情,创建一个从前一天的某个时间运行到当天的某个时间的程序。

        这就是我在前一天将开始日期设置为 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) 
        

        希望这对某人有所帮助。

        【讨论】:

        • 欢迎来到 Stack Overflow!请不要对多个问题发布相同的答案。发布一个好的答案,然后标记/投票以关闭其他问题作为重复问题。如果问题不是重复的,调整你对问题的回答。找到重复的答案here
        猜你喜欢
        • 1970-01-01
        • 2013-07-25
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多