Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 日期添加范围MSSQL之间的分钟数_Sql Server_Date Range_Dateadd_Minute - Fatal编程技术网

Sql server 日期添加范围MSSQL之间的分钟数

Sql server 日期添加范围MSSQL之间的分钟数,sql-server,date-range,dateadd,minute,Sql Server,Date Range,Dateadd,Minute,我在想一些事情时遇到了一些困难,比如说我有一个日期和时间 我想加上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-

我在想一些事情时遇到了一些困难,比如说我有一个日期和时间

我想加上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”

这看起来并不特别漂亮,但是

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;
使用沙箱;
去
创建表时间(DateNTime datetime2(0));
插入时报
值('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');
去
挑选*
从古至今;
去
选择T.DateNTime,
转换(time,T.DateNTime)时,您可以尝试以下方法:

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

这很难,但这应该适用于你所有的情况。此解决方案适用于任意数量的(正)分钟,结果将始终在参数化的小时内,加上相应的天数

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

我这样做是为了不需要硬编码任何值。

15在9-17之间。那么输出应该是18:00,对吗?@Sahi-OP意味着如果你达到17:00,那么你应该计算从第二天09:00开始的剩余时间。我需要它滚动到第二天的分钟数,输出在18:00是正确的,但我需要它滚动到第二天,因为这不是工作时间。你的意思是,DateADD操作后的DateTime应在9-17范围内。我知道你已经标记了你的解决方案,但是如果你仍然看到不一致的结果,你可以尝试我的解决方案。尝试将@min设置为900,结果是22:00。这只适用于提前1天的情况,只要你走了2天就会出错。如果我可以说周六和周日不要工作,周五16:00是结束时间,那么你就可以在清晨增加1180分钟。这确实很好,我在周日的比赛中又多了1255分钟。我需要考虑根据我的需要修改它。您如何将09:30或16:30添加到代码中,因为它标记为整数9和17。@在这种情况下,Kiel将它们更改为分钟而不是小时。09:30是9.5*60分钟,16:30是16.5*60分钟。将必须删除所有乘以范围小时变量的系数60(更改
(@rangehourrend-@RangeHourStart)*60)
(@rangehourrend-@RangeHourStart)
。不幸的是,您可能还需要调整其他一些事情。。。