如何获取TSQL中两个日期之间有多少小时4AM

use*_*707 1 sql t-sql sql-server datetime

我需要获取TSQL中两个日期之间发生了多少特定的小时。一些例子:

以下将得出结果= 1

declare @date1 datetime = '2019-10-01 00:00:00.000';
declare @date2 datetime = '2019-10-02 00:00:00.000';
Run Code Online (Sandbox Code Playgroud)

以下将使结果= 0,因为之间有0个4AM

declare @date1 datetime = '2019-10-01 05:00:00.000';
declare @date2 datetime = '2019-10-02 00:00:00.000';
Run Code Online (Sandbox Code Playgroud)

以下将得出结果= 2,因为之间有2个4AM

declare @date1 datetime = '2019-10-01 03:00:00.000';
declare @date2 datetime = '2019-10-02 05:00:00.000';
Run Code Online (Sandbox Code Playgroud)

以下示例将给出结果= 2,因为即使它们是在4:00 AM时间,也有2个4AM

declare @date1 datetime = '2019-10-01 04:00:00.000';
declare @date2 datetime = '2019-10-02 04:00:00.000';
Run Code Online (Sandbox Code Playgroud)

我已经尝试过类似的操作...但是给出的答案不正确

DECLARE @startdate AS DATETIME = '2019-10-01 03:00:00.000'
DECLARE @enddate   AS DATETIME = '2019-10-02 00:00:00.000'
DECLARE @hour int = 4

SELECT DATEDIFF(HOUR, @startdate, @endDate) / 24
     + 1 
     + CASE WHEN DATEPART(HOUR, @startdate) <= @hour AND 
                 DATEPART(HOUR, @endDate) >= @hour
            THEN 0
            ELSE -1
       END
Run Code Online (Sandbox Code Playgroud)

任何可以阐明的人,我将不胜感激

Lar*_*rnu 5

最简单的方法是从两个值中删除4小时,然后以天为单位求出差值:

DECLARE @date1 datetime = '2019-10-01 00:00:00.000';
DECLARE @date2 datetime = '2019-10-02 00:00:00.000';

SELECT DATEDIFF(DAY,DATEADD(HOUR, -4, @date1),DATEADD(HOUR, -4, @date2)); --RETURNS 31, as there are 31 days bewteen 10 Jan and 10 Feb
GO

DECLARE @date1 datetime = '2019-10-01T04:30:00.000';
DECLARE @date2 datetime = '2019-10-02T03:59:00.000';

SELECT DATEDIFF(DAY,DATEADD(HOUR, -4, @date1),DATEADD(HOUR, -4, @date2)); --RETURNS 0, as 04:00 never got to

GO

DECLARE @date1 datetime = '2019-10-01T03:30:00.000';
DECLARE @date2 datetime = '2019-10-03T04:30:00.000';

SELECT DATEDIFF(DAY,DATEADD(HOUR, -4, @date1),DATEADD(HOUR, -4, @date2)); --RETURNS 3, as 04:00 occurs on 01, 02 and 03 of October
Run Code Online (Sandbox Code Playgroud)

似乎OP也希望也计入该事件04:00。因此,我将开始时间再缩短一秒:

DECLARE @date1 datetime = '2019-10-01T04:00:00.000';
DECLARE @date2 datetime = '2019-10-02T04:00:00.000';

SELECT DATEDIFF(DAY,DATEADD(SECOND,-1,DATEADD(HOUR, -4, @date1)),DATEADD(HOUR, -4, @date2)); --returns 2

DECLARE @date1 datetime = '2019-10-01T04:00:00.000';
DECLARE @date2 datetime = '2019-10-01T04:00:01.000';

SELECT DATEDIFF(DAY,DATEADD(SECOND,-1,DATEADD(HOUR, -4, @date1)),DATEADD(HOUR, -4, @date2)); --Returns 1
Run Code Online (Sandbox Code Playgroud)

如果您实际上要存储精确到1/300秒的值,则不要使用1秒,而要使用3毫秒,以确保最大的准确性。