如何在两天(周一和周五)以下显示工作日?

时间:2011-03-18 20:28:27

标签: sql

如何使用SQL QUERY?

显示低于两天(星期一和星期五)的工作日
Date_From= 01/03/2011
Date_To =15/03/2011

我需要输出如下

Date_From   Date_To    
01/03/2011  01/03/2011
04/03/2011  04/03/2011  'Friday
05/03/2011  06/03/2011
07/03/2011  07/03/2011  'Monday
08/03/2011  10/03/2011
11/03/2011  11/03/2011  'Friday
12/03/2011  13/03/2011
14/03/2011  14/03/2011  'Monday
15/03/2011  15/03/2011

希望得到你的帮助

3 个答案:

答案 0 :(得分:0)

这是使用Oracle。如果我使用Oracle分析函数,我可以得到第15个,但我不知道可以通过一种可移植的方式将结果放在一行中以依赖于其他行的存在。此外,由于笛卡尔积,请不要将其用于少量行。

select to_char(d1.d, 'DD/MM/YYYY')
, to_char(d2.d, 'DD/MM/YYYY')
, decode(d1.n, 'MONDAY', '''Monday', 'FRIDAY', '''Friday')
from (select to_date('2011-02-28') + rownum as d
    , to_char(to_date('2011-02-28') + rownum, 'FMDAY') as n
    from user_objects where rownum <= 15) d1
, (select to_date('2011-02-28') + rownum as d
    , to_char(to_date('2011-02-28') + rownum, 'FMDAY') as n
    from user_objects where rownum <= 15) d2
where d1.d <= d2.d
and d2.d - d1.d < 7
and ((d1.d = d2.d and d1.n in ('MONDAY', 'FRIDAY'))
    or (d1.n = 'TUESDAY' and d2.n = 'THURSDAY')
    or (d1.n = 'SATURDAY' and d2.n = 'SUNDAY'))
order by d1.d, d2.d;

答案 1 :(得分:0)

select 
      t1.Date_From,  
      t1.Date_To, 
      case when DATENAME(dw,t1.Date_to) IN ('friday','monday') THEN DATENAME(dw,t1.Date_to) else NULL END    
from table t1

答案 2 :(得分:0)

这适用于SQL Server 2005 +。

DECLARE @Date_From datetime, @Date_To datetime;
SET @Date_From = '20110301';
SET @Date_To = '20110315';

WITH datelist AS (
  SELECT
    Date = @Date_From,
    GroupID = 1 
  UNION ALL
  SELECT
    Date = DATEADD(day, 1, Date),
    GroupID = CASE
      WHEN DATENAME(dw, Date) IN ('Sunday', 'Monday', 'Thursday', 'Friday')
      THEN 1
      ELSE 0
    END + GroupID
  FROM datelist
  WHERE Date < @Date_To
)
SELECT
  Date_From = MIN(Date),
  Date_To = MAX(Date)
FROM datelist
GROUP BY GroupID

输出:

Date_From               Date_To
----------------------- -----------------------
2011-03-01 00:00:00.000 2011-03-03 00:00:00.000
2011-03-04 00:00:00.000 2011-03-04 00:00:00.000
2011-03-05 00:00:00.000 2011-03-06 00:00:00.000
2011-03-07 00:00:00.000 2011-03-07 00:00:00.000
2011-03-08 00:00:00.000 2011-03-10 00:00:00.000
2011-03-11 00:00:00.000 2011-03-11 00:00:00.000
2011-03-12 00:00:00.000 2011-03-13 00:00:00.000
2011-03-14 00:00:00.000 2011-03-14 00:00:00.000
2011-03-15 00:00:00.000 2011-03-15 00:00:00.000