三班倒的数据表建立

slxslx1988 2014-08-18 09:42:57
各位大神,情况是这样的。
我们有三个班组:甲班,乙班,丙班;
我们是三班倒生产的,有早班、中班、和夜班
早班时间:上午7点到下午3点
中班时间:下午3点到下午11点
夜班时间:下午11点到第二天早上7点

甲乙丙三个班组,是轮着来的
比如:甲班早班,乙班中班,丙班夜班;那下一周就是乙班早班,丙班中班,甲班夜班;再下一周就是丙班早班,甲班中班,乙班夜班,这样往复循环;节假日即使不上班,也正常轮换。比如,这周甲班早班,这周放假,那下一周,甲班就直接上夜班了。

请问这样的情况,做表的时候,如何判断一个时间段,是哪个班上班。是否可以建立比较好的表,来进行QUERY
...全文
239 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaodongni 2014-08-22
  • 打赏
  • 举报
回复
week 班次 生产队 开始日期 结束日期 0 早 甲 20140818 9999-12-31 0 中 乙 20140818 9999-12-31 0 晚 丙 20140818 9999-12-31 1 早 乙 20140818 9999-12-31 1 中 丙 20140818 9999-12-31 1 晚 甲 20140818 9999-12-31 2 早 丙 20140818 9999-12-31 2 中 甲 20140818 9999-12-31 2 晚 乙 20140818 9999-12-31 不好意思 前面表格弄错了。然后select * from tablename where id=datediff(week,'20140818','20200401')%3 and 班次='中班'这个SQL 语句 如果查询20140818之前的日期除模是负数,可以select * from tablename where id=(datediff(week,'20140818','20200401')+99999)%3 and 班次='中班' 这样改下
xiaodongni 2014-08-22
  • 打赏
  • 举报
回复
week 班次 生产队 开始日期 结束日期 1 早 甲 20140818 9999-12-31 1 中 乙 20140818 9999-12-31 1 晚 丙 20140818 9999-12-31 2 早 乙 20140818 9999-12-31 2 中 丙 20140818 9999-12-31 2 晚 甲 20140818 9999-12-31 0 早 丙 20140818 9999-12-31 0 中 甲 20140818 9999-12-31 0 晚 乙 20140818 9999-12-31 建立这样一个表 比较开始日期(比如20140818日开始)我们算后面日期 比如20200402只需要求出select * from tablename where id=datediff(week,'20140818','20200401')%3 and 班次='中班' 注意SELECT里面的第二日是要知道日期的前一天,因为SQL SERVER 默认是从星期日开始的 所以需要处理下!
---涛声依旧--- 2014-08-20
  • 打赏
  • 举报
回复
要建立: 时间段表 班次表 排班明细表 打卡记录表 月统计表
云中客 2014-08-20
  • 打赏
  • 举报
回复
如果当前日期在开始日期的3周内,可以在语句中加判断,或者直接用存储过程或函数来实现
云中客 2014-08-20
  • 打赏
  • 举报
回复

create table t(xh int,zao varchar(2),zhong varchar(2),wan varchar(2))
insert into t
select 1,'甲','乙','丙' union all
select 2,'乙','丙','甲' union all
select 3,'丙','甲','乙' 

--计算结果(如果需要显示时间,可以调整具体的数据表结构)
select * From t where xh=(cast(datename(week,'2014-8-20') as int)- cast(datename(week,'2014-8-1') as int))/3

云中客 2014-08-20
  • 打赏
  • 举报
回复
其实三个班轮换,只有三种情况(把三种情况保存成表的形式,或者在程序中实现也可以),设置一个轮班的开始时间,然后用当前时间与开始时间进行比较,再取出三种情况中的一种
Tiger_Zhao 2014-08-20
  • 打赏
  • 举报
回复
把下面的执行结果插入排班表中,一年一次,够简单了吧。
DECLARE @Year       int
DECLARE @firstDay datetime
DECLARE @lastDay datetime
DECLARE @daysOfYear int

SET @Year = 2014 --年份
SET @firstDay = Convert(datetime, Convert(varchar(4),@Year)+'-01-01', 120)
SET @lastDay = Convert(datetime, Convert(varchar(4),@Year)+'-12-31', 120)
SET @daysOfYear = DateDiff(day, @firstDay, @lastDay) + 1
;
WITH dayList(date)
AS (
SELECT DateAdd(day, number, @firstDay)
FROM master.dbo.spt_values
WHERE type='p'
AND number < @daysOfYear
),
hourList(id,startHour,endHour)
AS (
SELECT 0,7,15 UNION ALL
SELECT 1,15,23 UNION ALL
SELECT 2,23,31
),
workShifts(startTime, endTime, week, teamId)
AS (
SELECT DateAdd(hour, h.startHour, d.date),
DateAdd(hour, h.endHour, d.date),
DatePart(week, date),
(h.id+DatePart(week, date)-1) % 3
FROM dayList d
, hourList h
),
teamList(id,name)
AS ( -- 这里根据上年最后一班调整甲乙丙次序
SELECT 0,'甲' UNION ALL
SELECT 1,'乙' UNION ALL
SELECT 2,'丙'
)
SELECT w.*,
t.name
FROM workShifts w
JOIN teamList t
ON t.id = w.teamID
ORDER BY w.startTime

startTime               endTime                 week        teamId      name
----------------------- ----------------------- ----------- ----------- ----
2014-01-01 07:00:00.000 2014-01-01 15:00:00.000 1 0 甲
2014-01-01 15:00:00.000 2014-01-01 23:00:00.000 1 1 乙
2014-01-01 23:00:00.000 2014-01-02 07:00:00.000 1 2 丙
2014-01-02 07:00:00.000 2014-01-02 15:00:00.000 1 0 甲
2014-01-02 15:00:00.000 2014-01-02 23:00:00.000 1 1 乙
2014-01-02 23:00:00.000 2014-01-03 07:00:00.000 1 2 丙
2014-01-03 07:00:00.000 2014-01-03 15:00:00.000 1 0 甲
2014-01-03 15:00:00.000 2014-01-03 23:00:00.000 1 1 乙
2014-01-03 23:00:00.000 2014-01-04 07:00:00.000 1 2 丙
2014-01-04 07:00:00.000 2014-01-04 15:00:00.000 1 0 甲
2014-01-04 15:00:00.000 2014-01-04 23:00:00.000 1 1 乙
2014-01-04 23:00:00.000 2014-01-05 07:00:00.000 1 2 丙
2014-01-05 07:00:00.000 2014-01-05 15:00:00.000 2 1 乙
2014-01-05 15:00:00.000 2014-01-05 23:00:00.000 2 2 丙
2014-01-05 23:00:00.000 2014-01-06 07:00:00.000 2 0 甲
2014-01-06 07:00:00.000 2014-01-06 15:00:00.000 2 1 乙
2014-01-06 15:00:00.000 2014-01-06 23:00:00.000 2 2 丙
2014-01-06 23:00:00.000 2014-01-07 07:00:00.000 2 0 甲
...
  • 打赏
  • 举报
回复
表很简单,你需要结合编程来完成

22,207

社区成员

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

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