代码之家  ›  专栏  ›  技术社区  ›  PJD

在SP中设置特定日期和时间

  •  -1
  • PJD  · 技术社区  · 6 年前

    我试图在存储过程中设置一个特定的日期范围,我的开始日期应该总是读取昨天的日期,小时设置为 23:00:00 所以完整的日期和时间戳应该是 2018-06-11 23:00:00 我的结束日期应该是今天的日期,上面有时间戳 22:59:59 所以完整的日期和时间戳应该是 2018-06-12 22:59:59 ,有人能帮我实现这个目标吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   EzLo tumao kaixin    6 年前

    使用 DATETIMEFROMPARTS :

    SELECT
        Now = GETDATE(),
        ForcedYesterday = DATETIMEFROMPARTS(
            YEAR(GETDATE() - 1),
            MONTH(GETDATE() - 1),
            DAY(GETDATE() - 1),
            23, -- Hour
            0, -- Minute
            0, -- Second
            0), -- Milliseconds
        ForcedToday = DATETIMEFROMPARTS(
            YEAR(GETDATE()),
            MONTH(GETDATE()),
            DAY(GETDATE()),
            22, -- Hour
            59, -- Minute
            59, -- Second
            0) -- Milliseconds
    

    使用 DATEDIFF :

    SELECT
        Now = GETDATE(),
        ForcedYesterday = DATEDIFF(DAY, 0, GETDATE() - 1) + CONVERT(DATETIME, '23:00:00.000'),
        ForcedToday = DATEDIFF(DAY, 0, GETDATE()) + CONVERT(DATETIME, '22:59:59.000')
    
        2
  •  2
  •   Gottfried Lesigang    6 年前

    另一个选项是字符串连接:

    WITH Today(ISO8601) AS (SELECT CONVERT(VARCHAR(10),GETDATE(),126)) --create an ISO8601-string
    SELECT DATEADD(DAY,-1,CAST(ISO8601 + 'T23:00:00' AS DATETIME)) AS Yesterday11pm
           ,CAST(ISO8601 + 'T22:59:59' AS DATETIME) AS TodayEndOfday
    FROM Today
    

    CTE将创建一个ISO8601日期字符串,如 "2018-06-12" . 查询添加时间(使用 T 作为分隔符)并将其强制转换为 DATETIME . 昨天是通过添加 1天。

    更新

    说到增加全天你可以替换 DATEADD 用一个简单的 -1 ,但我不建议采用这种方法:

    WITH Today(ISO8601) AS (SELECT CONVERT(VARCHAR(10),GETDATE(),126)) --create an ISO8601-string
    SELECT  CAST(ISO8601 + 'T23:00:00' AS DATETIME)-1 AS Yesterday11pm
           ,CAST(ISO8601 + 'T22:59:59' AS DATETIME) AS TodayEndOfday
    FROM Today
    

    如果您不喜欢CTE方法,可以不使用:

    SELECT  CAST(CONVERT(VARCHAR(10),GETDATE(),126) + 'T23:00:00' AS DATETIME)-1 AS Yesterday11pm
           ,CAST(CONVERT(VARCHAR(10),GETDATE(),126) + 'T22:59:59' AS DATETIME) AS TodayEndOfday
    
        3
  •  0
  •   John Cappelletti    6 年前

    另一个选项(如果是2012+)是在格式字符串中附加所需的时间

    例子

    Select  Date1 = format(GetDate()-1,'yyyy-MM-dd 23:00:00')
           ,Date2 = format(GetDate()-0,'yyyy-MM-dd 22:59:59')
    

    退换商品

    Date1                 Date2
    2018-06-11 23:00:00   2018-06-12 22:59:59
    

    请注意: Format() 有一些伟大的功能,但不知道是一个表演者。