0

我正在处理一天从最后一天 23:00 开始的要求。我需要获取将日期传递给 SQL 函数的日期开始日期时间。我们现在将自定义日期开始时间(即 23:00)和offset = -1(表示从最后一天开始)存储在表中。
例如,如果我通过:

  1. 10/30/2013 22:00它应该返回10/29/2013 23:00
  2. 10/30/2013 23:20它应该返回10/30/2013 23:00
  3. 10/31/2013 01:00它应该返回10/30/2013 23:00

目前我正在使用以下语句:(DayStartOffset = -1 and DayStartTime = 23:00:00)

    declare @datetime datetime 
    set @datetime = '2013-10-30 23:59:59'
    declare @date date
    declare @time time(3)
    set @date = @datetime
    set @time = @datetime
    declare @dayStartDateTime datetime 

    --DayStartOffset is set to -1
    --DayStartTime set to '23:00'
    SELECT @dayStartDateTime = DATEADD(dd,DayStartOffset,CAST(@date AS DATETIME)) +                 CAST(DayStartTime AS DATETIME)
     from table_name
     print @dayStartDateTime

但是对于上面的 1 和 3,它不能正常工作

你能帮我解决这个功能吗?

4

1 回答 1

1

在一行中

Create Function dbo.MyStartOfDay(@datetime datetime) returns datetime as
begin
    return dateadd(hour, -1, dateadd(day, datediff(day, 0, dateadd(hour, 1, @datetime)), 0))
end
Go
Select dbo.MyStartOfDay('2013-10-30 22:00');

坏掉了

Create Function dbo.MyStartOfDay(@datetime datetime) returns datetime as
begin
    declare @hourLater datetime = dateadd(hour, 1, @datetime)
    declare @roundToDay datetime = dateadd(day, datediff(day, 0, @hourLater), 0);
    declare @hourBack datetime = dateadd(hour, -1, @roundToDay)
    return @hourBack
end

换句话说,增加一个小时,向下舍入到最近的一天,然后休息一个小时。

Example SQLFiddle

于 2013-10-31T23:17:07.703 回答