2017-07-13 65 views
0

我有一個包含兩列的查詢結果,第二列是epoch unix時間的日期。查詢以日期參數爲例'7/1/2017'如何根據SQL中的日期篩選出結果

我想要做的是選擇最近輸入日期的leaseCode。因此,在下面的示例中,第一個結果EDMGW | 1533013200000比第二個結果更接近「7/1/2017」。我不想第二個EDMGW | 1690779600000行的結果。
任何想法你的SQL大師?

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

更接近'2017年7月1日'..這是否意味着日期也可以在'7/1/2017'之前? –

回答

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

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

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; 
0

如果你指的是最接近的日期應該是日或之後 2017年7月1日,你可以使用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'))