在sp中设置特定的日期和时间

时间:2018-06-12 09:23:26

标签: sql-server tsql

我正在尝试在存储过程中设置特定的日期范围,我的开始日期应始终在昨天的日期读取时间设置为23:00:00,因此完整的日期和时间戳应为2018-06-11 23:00:00和我的完成日期应始终在22:59:59上显示今天的时间戳,因此完整的日期和时间戳应为2018-06-12 22:59:59,有人可以帮助我实现这一目标吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

使用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 :(得分:0)

另一个选项(如果是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()有一些很棒的功能,但不知道是表演者。