以下は私のテーブルのサンプルレコードです。
フィールドはvarcharで、ToDateには2つの空のレコードが含まれています。(データベースNULLではありません)
CustomerID FromDate ToDate
1 20120810 20120920
2 20120901 20120915
3 20120112
4 20120815
5 20120817 20120920
6 20120817 20120920
以下のルールに従う必要があります。
- ToDate列の最も遠い日付で並べ替えます。
- レコードが空の場合、空ではなく現在の日付+30を取得します。
- ToDateで2つの日付が同じである場合は、FromDateで最も遠い日付を取得します。
したがって、上記のレコードのサンプルでは、次のような出力が必要です。
CustomerID FromDate ToDate
3 20120112 20130221
顧客ID4と5のToDateは空であるため、getdate()関数から30日を追加する必要があると考えます。つまり、Todateは等しいので、FromDateで並べ替えたいと思います。
日付の入力は20120810です
select top 1 customer_id,
max(convert(datetime,Fromdate,101)) as Fromdate,
convert(datetime,(CASE WHEN Todate = '' THEN getdate() + 30 WHEN Todate != '' THEN Todate END),101) as Todate,
customer_id
FROM dbo.sample_tbl (nolock)
WHERE customer_id = '1'
AND Fromdate <= '20120810'
AND (CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END) >= '20120810'
group by convert(datetime,(CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END),101),customer_id
order by convert(datetime,(CASE WHEN ToDate = '' THEN getdate() + 30 WHEN ToDate != '' THEN ToDate END),101) desc
現在の出力は
CustomerID FromDate ToDate
3 20120112 20130221
期待されるのは
CustomerID FromDate ToDate
3 20120815 20130221