改进或缩短sql查询选择结果表[日期]

时间:2013-06-27 09:25:53

标签: sql select

我有一个日期表和一列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

但我的案例查询太长了,无论如何都要缩短代码或提高性能?

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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

鉴于From日期始终低于或等于To Date

答案 2 :(得分: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 fiddle