我正在尝试在存储过程中设置特定的日期范围,我的开始日期应始终在昨天的日期读取时间设置为23:00:00
,因此完整的日期和时间戳应为2018-06-11 23:00:00
和我的完成日期应始终在22:59:59
上显示今天的时间戳,因此完整的日期和时间戳应为2018-06-12 22:59:59
,有人可以帮助我实现这一目标吗?
答案 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()
有一些很棒的功能,但不知道是表演者。