sql-server - DATEADD MINUTES 范围之间 MSSQL

标签 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-24 09:00' AND '2018-05-24 17:00'

所以答案是“2018-05-25 10:00”

最佳答案

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

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

我这样做是为了让您无需硬编码任何值。

关于sql-server - DATEADD MINUTES 范围之间 MSSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50506262/

相关文章:

sql - 从单列中选择多行到单行

java - 无法使用 HQL 从我的 Java 应用程序查询包含阿拉伯语的 SQL Server 表

mysql - mysql View 中的日期范围导致缓慢

linq - Entity Framework : Best way to query for a set of dates using Linq

sql-server - 在查询的 DATEADD 函数中使用参数

c# - 不返回任何行的 SELECT sql 语句的 ExecuteNonQuery

sql - 摆脱 SQL Server 中的 "Magic"数字

mysql - sql选择日期范围明年问题

tsql - 使用小数的 DATEADD - 解决方法?