求一条生成一个月排班的SQL语句,谢谢
比如说该月,每星期一到星期五上班,每星期六日休息,如果用SQL语句生成这一个月的上班表,
[解决办法]
select DATEADD(day,number,convert(varchar(7),GETDATE(),120)+'-01') as a,
case when DATEPART(WEEKDAY,DATEADD(day,number,convert(varchar(7),GETDATE(),120)+'-01')) not in (1,7) then '上班'
else '放假' end as 安排
from master.dbo.spt_values
where type='p'
declare @month datetime = '2014-1-1'
declare @days int
set @month = DATEADD(day, 1-datepart(day, @month), @month)
set @days = DATEDIFF(day, @month, dateadd(MONTH, 1, @month))
;
with day as (
select DATEADD(day,number,@month) date,DATEPART(weekday, DATEADD(day,number,@month)) week from master..spt_values where type='P' and number<@days
)
select date, case when week=1 or week=7 then '休息' else '上班' end from day
DECLARE @ym CHAR(6)
SET @ym='201401'
;WITH a1 AS
(
SELECT CAST(@ym+'01' AS DATETIME) date_d
UNION ALL
SELECT DATEADD(d,1,date_d) FROM a1
WHERE CONVERT(CHAR(6),DATEADD(d,1,date_d),112)=@ym
)
,a2 AS
(
SELECT *,DATEPART(weekday,date_d) week_day
FROM a1
)
SELECT *,CASE WHEN week_day IN (1,7) then '休息' else '上班' end
FROM a2
with t as
(select dateadd(d,number,stuff(convert(varchar,getdate(),23),9,2,'01')) 'd'
from master.dbo.spt_values
where type='P' and
datediff(m,
stuff(convert(varchar,getdate(),23),9,2,'01'),
dateadd(d,number,stuff(convert(varchar,getdate(),23),9,2,'01')))=0)
select convert(varchar(20),d,23) 'd',
case datepart(dw,d) when 1 then '星期日'
when 2 then '星期一'
when 3 then '星期二'
when 4 then '星期三'
when 5 then '星期四'
when 6 then '星期五'
when 7 then '星期六' end 'w',
case when datepart(dw,d) in(1,7) then '休息'
when datepart(dw,d) in(2,3,4,5,6) then '上班' end 'x'
from t
/*
d w x
-------------------- ---------- ----------
2014-01-01 星期三 上班
2014-01-02 星期四 上班
2014-01-03 星期五 上班
2014-01-04 星期六 休息
2014-01-05 星期日 休息
2014-01-06 星期一 上班
2014-01-07 星期二 上班
2014-01-08 星期三 上班
2014-01-09 星期四 上班
2014-01-10 星期五 上班
2014-01-11 星期六 休息
2014-01-12 星期日 休息
2014-01-13 星期一 上班
2014-01-14 星期二 上班
2014-01-15 星期三 上班
2014-01-16 星期四 上班
2014-01-17 星期五 上班
2014-01-18 星期六 休息
2014-01-19 星期日 休息
2014-01-20 星期一 上班
2014-01-21 星期二 上班
2014-01-22 星期三 上班
2014-01-23 星期四 上班
2014-01-24 星期五 上班
2014-01-25 星期六 休息
2014-01-26 星期日 休息
2014-01-27 星期一 上班
2014-01-28 星期二 上班
2014-01-29 星期三 上班
2014-01-30 星期四 上班
2014-01-31 星期五 上班
(31 row(s) affected)
*/
select Convert(varchar(12),dateadd(dd,number,'2014-01-01'),111)'日期',
case when datepart(dw,dateadd(dd,number,'2014-01-01'))<7 and
datepart(dw,dateadd(dd,number,'2014-01-01'))>1 then '工作' else '放假' end '安排'
from master.dbo.spt_values where type='p' and
number < datediff(dd,'2014-01-01','2014-02-01')
---查询结果
日期 安排
------------ ----
2014/01/01 工作
2014/01/02 工作
2014/01/03 工作
2014/01/04 放假
2014/01/05 放假
2014/01/06 工作
2014/01/07 工作
2014/01/08 工作
2014/01/09 工作
2014/01/10 工作
2014/01/11 放假
2014/01/12 放假
2014/01/13 工作
2014/01/14 工作
2014/01/15 工作
2014/01/16 工作
2014/01/17 工作
2014/01/18 放假
2014/01/19 放假
2014/01/20 工作
2014/01/21 工作
2014/01/22 工作
2014/01/23 工作
2014/01/24 工作
2014/01/25 放假
2014/01/26 放假
2014/01/27 工作
2014/01/28 工作
2014/01/29 工作
2014/01/30 工作
2014/01/31 工作
(31 行受影响)
--查询当月上班表
;with ct as
(
select Convert(varchar,dateadd(dd,number,Convert(varchar,Convert(varchar(7),getdate(),23))+'-01'),23)'日期'
from master.dbo.spt_values where type='p' and
number < datediff(dd,Convert(varchar,Convert(varchar(7),getdate(),23))+'-01',
Convert(varchar,Convert(varchar(7),dateadd(m,1,getdate()),23))+'-01')
)
select *,
case datepart(dw,日期) when 1 then '星期日'
when 2 then '星期一'
when 3 then '星期二'
when 4 then '星期三'
when 5 then '星期四'
when 6 then '星期五'
else '星期六' end '星期',
case when datepart(dw,日期)<7 and
datepart(dw,日期)>1 then '工作' else '放假' end '安排'
from ct
--查询结果
日期 星期 安排
------------------------------ ------ ----
2014-01-01 星期三 工作
2014-01-02 星期四 工作
2014-01-03 星期五 工作
2014-01-04 星期六 放假
2014-01-05 星期日 放假
2014-01-06 星期一 工作
2014-01-07 星期二 工作
2014-01-08 星期三 工作
2014-01-09 星期四 工作
2014-01-10 星期五 工作
2014-01-11 星期六 放假
2014-01-12 星期日 放假
2014-01-13 星期一 工作
2014-01-14 星期二 工作
2014-01-15 星期三 工作
2014-01-16 星期四 工作
2014-01-17 星期五 工作
2014-01-18 星期六 放假
2014-01-19 星期日 放假
2014-01-20 星期一 工作
2014-01-21 星期二 工作
2014-01-22 星期三 工作
2014-01-23 星期四 工作
2014-01-24 星期五 工作
2014-01-25 星期六 放假
2014-01-26 星期日 放假
2014-01-27 星期一 工作
2014-01-28 星期二 工作
2014-01-29 星期三 工作
2014-01-30 星期四 工作
2014-01-31 星期五 工作
(31 行受影响)