【问题标题】:SQL Server 2012 : finding the closest date, of muliple columns & rowsSQL Server 2012:查找最接近的日期,多列和多行
【发布时间】:2017-08-30 08:00:59
【问题描述】:

我正在努力寻找从多列和多行中获取最接近值的最佳方法。在下面的代码中,我只从StartDate 获得SEQ 数字,但我还需要知道与@ValidationTime 相比,第1 行的EndDate 是否比开始日期更近。

例如,如果@Validationtime 是 10:10,则第 1 行是最接近的值,但 10:20 更接近第 2 行。

最后,我只会处理“最近的插槽”(1 行)。

我希望我以一种不太混乱的方式解释它。 :)

DECLARE @ValidationTime as datetime

SET @ValidationTime = '2017-08-29 10:10:00.000'
--SET @ValidationTime = '2017-08-29 10:20:00.000'

DECLARE @table TABLE (ID INT, StartDate datetime, EndDate datetime);

INSERT INTO @table 
VALUES (1, '2017-08-29 08:00:00.000', '2017-08-29 10:00:00.000'),    
       (1, '2017-08-29 10:30:00.000', '2017-08-29 21:00:00.000'),    
       (1, '2017-08-30 08:00:00.000', '2017-08-30 10:00:00.000'),
       (1, '2017-08-30 19:00:00.000', '2017-08-30 21:00:00.000');

SELECT 
    ID, StartDate, EndDate, 
    ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ABS(DATEDIFF(MINUTE, StartDate, @ValidationTime))) AS SEQ
FROM 
    @table

【问题讨论】:

    标签: sql-server sql-server-2012 compare datediff row-number


    【解决方案1】:

    使用案例。 .何时检查哪个更近

    SELECT  ID, 
        StartDate, 
        EndDate, 
        ROW_NUMBER() OVER ( Partition by  ID
                    Order by CASE   WHEN ABS(DateDiff(MINUTE,StartDate,@ValidationTime)) < ABS(DateDiff(MINUTE,EndDate,@ValidationTime))
                            THEN ABS(DateDiff(MINUTE,StartDate,@ValidationTime))
                            ELSE ABS(DateDiff(MINUTE,EndDate,@ValidationTime))
                            END
                  ) AS SEQ
    FROM    @table
    

    【讨论】:

    • 是的,当然!案子!我怎么没想到。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多