DATEADD MINUTES Между диапазонами MSSQL - PullRequest
0 голосов
/ 24 мая 2018

У меня возникают трудности с попыткой что-то выяснить, скажем, у меня есть дата и время;

И я хочу добавить к нему 180 минут так;

SELECT DATEADD(MINUTE,180,'2018-05-24 15:00')

Это даст мне ответ на вопрос «2018-05-24 18:00», но я хочу сделать это вдиапазон, так что ДОБАВЬТЕ минуты, если вы находитесь между 09:00 - 17:00, что-то вроде этого;

SELECT DATEADD(MINUTES,180,'2018-05-24 15:00') WHERE '2018-05-24 15:00' BETWEEN '2018-05-24 09:00' AND '2018-05-24 17:00'

Таким образом, ответ на этот вопрос будет "2018-05-25 10:00"

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Вы можете попробовать это:

DECLARE @input DATETIME='2018-05-24 15:00'
    DECLARE @min INT=180

    SELECT CASE WHEN DATEADD(MINUTE,@min,@input)>DATEADD(HOUR, 17,DateAdd(Day, Datediff(Day,0, @input), 0)) 
        THEN  DATEADD(MINUTE,
                        DATEDIFF(MINUTE,
                                DATEADD(HOUR, 17,
                                    DATEADD(Day, 
                                        DATEDIFF(Day,0, @input),
                                    0)
                                ),
                                DATEADD(MINUTE,@min,@input)), 
                                    DATEADD(Hour,9,
                                        DATEADD(Day,1,
                                            DateAdd(Day, 
                                                Datediff(Day,0, @input),
                                                0)
                                        )
                                    )
                                )

        ELSE DATEADD(MINUTE,@min,@input)
        END
0 голосов
/ 24 мая 2018

Было тяжело, но это должно работать для всех ваших случаев.Это решение работает для любого количества (положительных) минут, и результат всегда будет находиться в параметризованных часах, добавляя соответствующее количество дней.

DECLARE @RangeHourStart INT = 9
DECLARE @RangeHourEnd INT = 17

DECLARE @MinutesToAdd INT = 120

DECLARE @Date DATETIME = '2018-05-24 15:00'

SELECT
    FinalDate = CASE 
        WHEN -- When final hour exceeds the range hour
            DATEPART(HOUR, @Date) * 60 + 
            DATEPART(MINUTE, @Date) +
            @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60) > @RangeHourEnd * 60 

        THEN
            DATEADD(HOUR, -1 * (@RangeHourStart - 1), 
                DATEADD(DAY, 1, 
                    DATEADD(MINUTE, @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60), 
                        DATEADD(
                            DAY,
                            @MinutesToAdd / ((@RangeHourEnd - @RangeHourStart) * 60),
                            @Date)))) 

        ELSE
            DATEADD(MINUTE, @MinutesToAdd % ((@RangeHourEnd - @RangeHourStart) * 60), 
                DATEADD(
                    DAY,
                    @MinutesToAdd / ((@RangeHourEnd - @RangeHourStart) * 60),
                    @Date))
        END

Я сделал это, чтобы вам не нужно было жестко кодироватьлюбое значение.

0 голосов
/ 24 мая 2018

Это не выглядит особенно красиво, однако ...

USE Sandbox;
GO

CREATE TABLE Times (DateNTime datetime2(0));
INSERT INTO Times
VALUES ('20180520 10:00:00'),
       ('20180520 15:20:00'),
       ('20180521 09:32:00'),
       ('20180521 14:17:00'),
       ('20180522 16:54:00'),
       ('20180523 12:46:00'),
       ('20180524 15:32:00');
GO


SELECT *
FROM Times;
GO

SELECT T.DateNTime,
       CASE WHEN CONVERT(time,T.DateNTime) <= '14:00' THEN DATEADD(MINUTE, 180,T.DateNTime)
            ELSE DATEADD(MINUTE, 180 - DATEDIFF(MINUTE,T.DateNTime,DATEADD(HOUR,17,DATEADD(DAY, DATEDIFF(DAY, 0, T.DateNTime),0))), DATEADD(HOUR,9,DATEADD(DAY, DATEDIFF(DAY, 0, T.DateNTime) + 1,0))) END
FROM Times T;

GO

DROP TABLE Times;
...