我有一个日期表和一列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
但我的案例查询太长了,无论如何都要缩短代码或提高性能?
答案 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