求一条绝妙的Select语句,急!!!请高手执教!!!急!!!

qiansl 2003-12-25 01:23:01
考勤排班,表tableA有2个字段,内容如下:
ID shift
----------------
1 B-中班
2 B-中班
3 B-中班
4 C-夜班
5 C-夜班
6 A-早班
7 A-早班
8 A-早班

用select datediff(day,ID,'2003-11-30') as day,shift from tableA
可以得到:
Day shift
----------------
2003-12-1 B-中班
2003-12-2 B-中班
2003-12-3 B-中班
2003-12-4 C-夜班
2003-12-5 C-夜班
2003-12-6 A-早班
2003-12-7 A-早班
2003-12-8 A-早班

但 2003-12-6,2003-12-7为周末,怎么写可以自动跳过???
效果如下:
Day shift
----------------
2003-12-1 B-中班
2003-12-2 B-中班
2003-12-3 B-中班
2003-12-4 C-夜班
2003-12-5 C-夜班
2003-12-8 A-早班
2003-12-9 A-早班
2003-12-10 A-早班

求一条绝妙的Select语句,急!!!请高手执教!!!急!!!

...全文
33 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiansl 2003-12-25
  • 打赏
  • 举报
回复
其实,我的意图是跳过国定假日,5.1,10.1,春节(日期不固定)---
好在搞了一天搞出来了,谢谢各位!马上给分
perfwell 2003-12-25
  • 打赏
  • 举报
回复
select dateadd(day,(id+(id/5)*2),'2003-11-30') as day,shift from tablea

不对不要分。。。
Rotaxe 2003-12-25
  • 打赏
  • 举报
回复

如果'2003-11-30'是固定的,可以
select case when dateAdd(day,ID%5+ID/5*7,'2003-11-30') as day,shift from tableA
victorycyz 2003-12-25
  • 打赏
  • 举报
回复
好的处理方式是这样:把工作日的日期存在一个日历表里,不仅可以滤掉周六、周日,还可以滤掉所有的假期,比如国庆甚至厂庆放假日. 这样处理起来很灵活。类似下列数据:
表名:工作日历
id workdate
1 2004-1-5
2 2004-1-6
3 2004-1-7
4 2004-1-8
5 2004-1-9
6 2004-1-12
7 2004-1-13
8 2004-1-15 ---呵呵,1月14日厂庆日哦。
9 2004-1-16

select a.workdate, b.shift
from 工作日历 a, tableA b
where (a.id % 8)+1 =b.id
order by a.workdate

qiansl 2003-12-25
  • 打赏
  • 举报
回复

不好意思,你们都不对,你们的效果是:

Day shift
----------------
2003-12-1 B-中班
2003-12-2 B-中班
2003-12-3 B-中班
2003-12-4 C-夜班
2003-12-5 C-夜班
2003-12-8 A-早班
2003-12-9 B-中班
2003-12-10 B-中班

2003-12-6,2003-12-7的周末仍然占了2天的班次“位”,我要自动跳过,不影响后面的排班!!

效果如下:
Day shift
----------------
2003-12-1 B-中班
2003-12-2 B-中班
2003-12-3 B-中班
2003-12-4 C-夜班
2003-12-5 C-夜班
2003-12-8 A-早班
2003-12-9 A-早班
2003-12-10 A-早班

怪我说得不是很清楚,急------------
caiyunxia 2003-12-25
  • 打赏
  • 举报
回复
select * from
tablea
where DATEPART(dw,[day]) in(1,7)
gmlxf 2003-12-25
  • 打赏
  • 举报
回复
DATEPART
返回代表指定日期的指定日期部分的整数。

语法
DATEPART ( datepart , date )

参数
datepart

是指定应返回的日期部分的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。

日期部分 缩写
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
Hour hh
minute mi, n
second ss, s
millisecond ms


week (wk, ww) 日期部分反映对 SET DATEFIRST 作的更改。任何一年的 1 月 1 日定义了 week 日期部分的开始数字,例如:DATEPART(wk, 'Jan 1, xxxx') = 1,此处 xxxx 代表任一年。

weekday (dw) 日期部分返回对应于星期中的某天的数,例如:Sunday = 1、Saturday = 7。weekday 日期部分产生的数取决于 SET DATEFIRST 设定的值,此命令设定星期中的第一天。

date

是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。对 1753 年 1 月 1 日之后的日期用datetime 数据类型。更早的日期存储为字符数据。当输入 datetime 值时,始终将其放入引号中。因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。

如果只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049 (默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。

有关时间值指定的更多信息,请参见时间格式。有关日期指定的更多信息,请参见 datetime 和 smalldatetime。

返回类型
int

gmlxf 2003-12-25
  • 打赏
  • 举报
回复
select datediff(day,ID,'2003-11-30') as day,shift from tableA
where datapart(dw,Day,datediff(day,ID,'2003-11-30')) not in (1,7)
txlicenhe 2003-12-25
  • 打赏
  • 举报
回复
select datediff(day,ID,'2003-11-30') as day,shift from tableA
where datepart(weekday,datediff(day,ID,'2003-11-30')) not in (1,7)

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧