1

Date のテーブルと、ID、FromDate、および ToDate の列を以下に示します。

ID    FromDate                  ToDate
--    --------------            --------------
1     2013-06-10 00:00:00       2013-06-30 00:00:00
2     2013-05-10 00:00:00       2013-06-10 00:00:00
3     2012-08-01 00:00:00       2012-12-31 00:00:00
4     2013-07-10 00:00:00       2013-07-30 00:00:00

以下に示す[getdate]を使用して、チェッククエリを実行し、アクティブ、非アクティブ、または期限切れのいずれであるかを結果として列を作成します

Select ID, FromDate, ToDate,
       (case when convert(varchar(8),FromDate,112) <= convert(varchar(8),getdate(),112)
                  and convert(varchar(8),ToDate,112) <= convert(varchar(8),getdate(),112) then 'Expired'       
             when convert(varchar(8),FromDate,112) <= convert(varchar(8),getdate(),112)
                  and convert(varchar(8),ToDate,112) >= convert(varchar(8),getdate(),112) then 'Active'
             when convert(varchar(8),FromDate,112) >= convert(varchar(8),getdate(),112) 
                  and convert(varchar(8),ToDate,112) >= convert(varchar(8),getdate(),112) then 'Inactive' end )'Result'
from Date

正しい結果が表示されます

ID    FromDate                  ToDate                 Result
--    --------------            --------------         -------- 
1     2013-06-10 00:00:00       2013-06-30 00:00:00    Active
2     2013-05-10 00:00:00       2013-06-10 00:00:00    Expired
3     2012-08-01 00:00:00       2012-12-31 00:00:00    Expired
4     2013-07-10 00:00:00       2013-07-30 00:00:00    Inactive

しかし、Case クエリが長すぎます。コードを短くしたり、パフォーマンスを向上させる方法はありますか?

4

3 に答える 3

2

クエリはどうですか:

Select 
    ID, 
    FromDate, 
    ToDate,
    (case when convert(varchar(8),ToDate,112) <= convert(varchar(8),getdate(),112) then 'Expired'       
        when convert(varchar(8),getdate(),112) between convert(varchar(8),FromDate,112) and convert(varchar(8),ToDate,112) then 'Active'
        when convert(varchar(8),FromDate,112) >= convert(varchar(8),getdate(),112) then 'Inactive' end )'Result'
from Date

ToDate が FromDate より大きい場合。

于 2013-06-27T09:36:06.010 に答える
0
SELECT ID, FromDate, ToDate,
    CASE WHEN ToDateStr <= NowStr THEN 'Expired'
         WHEN NowStr BETWEEN FromDateStr AND ToDateStr THEN 'Active'
         ELSE 'Inactive' END AS Result
FROM (
SELECT 
    ID, FromDate, ToDate, 
    CONVERT(varchar(8),FromDate,112) AS FromDateStr,
    CONVERT(varchar(8),ToDate,112) AS ToDateStr,
    CONVERT(varchar(8),getdate(),112) AS NowStr
FROM Date) A

開始日が常に終了日より前か等しい場合

于 2013-06-27T09:47:28.507 に答える
0
select id, fromDate, toDate,
case 
    when daysFromStart > 0 AND daysToEnd > 0 then 'Active'
    when daysFromStart > 0 AND daysToEnd < 0 then 'Expired'
    when daysFromStart < 0 AND daysToEnd > 0 then 'Inactive'
end
from  
(
select 
    id, fromDate, toDate, 
    DATEDIFF(day, fromDate, getdate()) as daysFromStart, 
    DATEDIFF(day, getdate(), toDate) as daysToEnd 
from orders
) t

SQLフィドル

于 2013-06-27T10:08:40.940 に答える