代码之家  ›  专栏  ›  技术社区  ›  Kiel

日期在范围mssql之间添加分钟数

  •  2
  • Kiel  · 技术社区  · 6 年前

    我想弄清楚一些事情有点困难,比如说我有约会和时间;

    我想增加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 回复  |  直到 6 年前
        1
  •  1
  •   EzLo tumao kaixin    6 年前

    很难,但这对你所有的案件都适用。此解决方案的工作时间为(正)分钟,结果始终在参数化小时内,并添加相应的天数。

    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
    

    我做到了,所以你不需要硬编码任何值。

        2
  •  1
  •   Larnu    6 年前

    不过,这看起来并不特别漂亮……

    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;
    
        3
  •  1
  •   Larnu    6 年前

    您可以尝试以下操作:

    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