如何根据SQL

时间:2017-07-13 16:34:13

标签: sql sql-server

我有一个包含两列的查询结果,第二列是epoch unix时间的日期。该查询采用日期参数,例如'7/1/2017'

我想要做的是选择与输入日期最近的leaseCode。因此,在下面的示例中,第一个结果EDMGW | 1533013200000将比第二个结果更接近“7/1/2017”。

我不希望结果中的第二行EDMGW | 1690779600000 您是SQL专家的想法吗?

LseCode      | ExpDate  
-------------+---------------  
EDMGW        | 1533013200000  
EDMGW        | 1690779600000  
CHA08LL      | 1496210400000  
FRE05LL      | 1559282400000

4 个答案:

答案 0 :(得分:1)

戈登的回答可能足以满足您的需求,如果是这样,那就去吧。如果你真的想要一个查询,它会找到每个租约代码最接近给定日期的条目,那么我们必须做更多的工作。一种方法是将到期日期从自纪元以来的毫秒转换为SQL Server日期,然后计算您选择的另一个日期参数之间的绝对差值(例如2017-07-01)。

SELECT t.*
FROM
(
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY LseCode
            ORDER BY ABS(DATEDIFF(S, DATEADD(S, [ExpDate]/1000, '1970-01-01'), '20170701'))) rn
    FROM yourTable
) t
WHERE t.rn = 1

在这里演示:

Rextester

答案 1 :(得分:0)

您可以使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by lsecode order by expdate asc) as seqnum
      from t
     ) t
where seqnum = 1;

对于你的情况,我猜你真的是指最早的ExpDate

答案 2 :(得分:0)

DEFINE @param DATE = '07/01/2017';

SELECT TOP 1 leasecode 
FROM t WHERE convert(date,dbo.ToDateTime(ExpDate)) <= convert(date,@param)
ORDER BY t.date DESC;

最近的意思是指第一条记录在用户提供日期之前或之前的日期,或者与日期的绝对差异最接近?此外,既然您正在使用DAY,那么您想如何在同一天处理租赁代码? Sry无法测试日期条件,而不是在此刻的机器之前。

/* one row only - with arbitrary resolution of ties absolute dstance */
WITH d AS (
    SELECT *,ROW_NUMBER() OVER (ORDER BY 
    ABS( datediff(day, CONVERT( date, dbo.ToDateTime(ExpDate) ) , convert( date, @param ) ) AS dst FROM t
)
SELECT * FROM d WHERE dst = 1;

/* all rows that with and ExpDate the same number of absolute days from your parameter */
WITH d AS (
    SELECT *,DENSE_RANK() OVER (ORDER BY 
    ABS( datediff(day, CONVERT( date, dbo.ToDateTime(ExpDate) ) , convert( @param , date ) ) ) AS dst FROM t
)
SELECT * FROM d WHERE dst = 1;

答案 3 :(得分:0)

如果您的意思是 2017-07-01之后,则可以使用top和一些dateadd逻辑将纪元转换为date用于获取日期差异并将其用于order结果。

select top 1 with ties lseCode,expDate
from t
where datediff(day,'2017-07-01',dateadd(second, expDate/1000, '1970-01-01')) >= 0
order by datediff(day,'2017-07-01',dateadd(second, expDate/1000, '1970-01-01'))