2017-07-13 7 views
0

2つの列を持つクエリ結果があります。第2列は、エポック・ユニックス時間の日付です。クエリに日付のパラメータ、たとえば '7/1/2017'が付きますSQLの日付に基づいて結果をフィルタリングする方法

私がしたいのは、入力した日付に最も新しいleaseCodeを選択することです。したがって、下のサンプルでは、​​最初の結果EDMGW | 1533013200000は2番目の結果よりも「7/1/2017」に近いでしょう。

結果に2番目のEDMGW | 1690779600000行は入れません。
あなたはSQLの功績がありますか?

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

「7/1/2017」に近いと、日付が「7/1/2017」より前にある可能性がありますか? –

答えて

1

ゴードンの答えは、あなたのニーズに十分であり、そうであればそれと一緒に行くことができます。各リースコードの日付に最も近いエントリを見つけるクエリが本当に必要な場合は、より多くの作業を行う必要があります。 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日日以降であることを意味している場合は、いくつかのdateaddロジックと一緒にtopを使用することができます日付の差分を取得してその結果をorderに送信するには、エポックをdateに変換します。

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')) 
関連する問題