高难挑战:如何用SQL语句求分段时间的字段值?

hugeant 2002-01-12 07:05:36
一个单位,工人上班的班次分为甲,乙,丙,丁四个班时,某天的时间安排大概如下:
工作时间 班次
0~8 时 甲
8~16时 乙
16~24时 丙
休息 丁
其中3个班次的人上班,一个班次的人休息, 第二天的班次排列不是顺序轮换的,也就是说,第二天可能是
工作时间 班次
0~8 时 乙
8~16时 丙
16~24时 丁
休息 甲
也可能是
工作时间 班次
0~8 时 丁
8~16时 甲
16~24时 乙
休息 丙
或则是其它的排列,但一般是8天一个循环,所以我把班次安排做成一张表WorkTime,只要
给出日期,就能查出那一天的班次安排。字段如下:
字段 idx(日期序号) workidx(班次代号) worktimeidx(工作时间代号)
值的范围 1~8 1~4 1~4
该表只有8条记录,代表了一个循环的班次安排

给出某天的日期,只要求出该年的第一天到该天的天数除8,剩下的余数即是该表中的
日期序号idx ,workidx字段的值1~4代表了甲,乙,丙,丁四个班次,worktimeIdx
代表该班次的4种工作时间安排。

所有班次的工作记录都记录在一个数据库表WorkData中,每10分钟左右一条记录,
每条记录都有一个记录时间字段,比如:有如下记录字段:
quntity(产量) recordtime(记录时间)

数据库用的是MS SQL2000服务器

现在需要求某一个时间段中,甲班,乙班,丙班,丁班各个班次的工作累计或平均值。
比如求去年12月2日8点到本月5日之间,甲班的总产量或平均产量,乙班的总产量或平均
产量,丙班的总产量或平均产量,丁班的平均产量或总产量。

问题是:
如何用SQL语句产生对某个班次的工作求累计值?
如何用SQL语句产生对某个班次的工作求平均值?

问了几个自称是SQL高手的人,都没有答案 :(








...全文
192 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
smartdonkey 2002-01-30
  • 打赏
  • 举报
回复
sky_blue(蓝天) 作得对
hugeant 2002-01-28
  • 打赏
  • 举报
回复
KingSunSha(弱水三千) ,你的方法好象只是当quntity表示该10分钟内的产量时才行,假如
该quntity字段的值是年初到当前的累计(积算)值时,好象没法算啊?
hugeant 2002-01-28
  • 打赏
  • 举报
回复
我试试
蓝天 2002-01-28
  • 打赏
  • 举报
回复
试试吧,我觉得我那条查询是可以完成你要求的任务的
hugeant 2002-01-28
  • 打赏
  • 举报
回复
sky_blue(蓝天) 说的对,前面我只是在设计,做的时候发现要32条记录
蓝天 2002-01-28
  • 打赏
  • 举报
回复
该表只有8条记录,代表了一个循环的班次安排
我觉得应该有8*4 32条记录才对.
signboy 2002-01-28
  • 打赏
  • 举报
回复
create table J_powerprop
(
id int not null,
teamnumber int not null,
teamorder varchar(50) not null,
startdate datetime not null,
primary key(id)
)
signboy 2002-01-28
  • 打赏
  • 举报
回复
Set rstTemp = dbsNorthwind.OpenRecordset("select teamnumber,teamorder,startdate from j_powerprop")
If rstTemp.EOF Then
MsgBox "请设置运行人员倒班表!", vbDefaultButton1, "错误"
Else
'i_df = (DateDiff("d", rstTemp.Fields(2).Value, Format(t_date.Text, "yyyy-mm") + "-01") + 0) Mod rstTemp.Fields(0).Value
i_df = DateDiff("d", rstTemp.Fields(2).Value, t_date.Text) Mod rstTemp.Fields(0).Value
MsgBox Mid(rstTemp.Fields(1).Value, (i_df) * 6 + 1, 5)
End If
signboy 2002-01-28
  • 打赏
  • 举报
回复
 KingSunSha(弱水三千) (2002-1-13 0:57:14) 得0分
建一个表,结构如下
table work_shift(from_date, to_date, team_id)
from_date to_date team_id
2001/01/01 00:00:00 2001/01/01 07:59:59 甲
2001/01/01 08:00:00 2001/01/01 15:59:59 乙
2001/01/01 16:00:00 2001/01/01 23:59:59 丙
。。。。。

有这样一个表,查询就非常容易了,而且这个表很小,一年才365*3=1095条纪录,根本不影响系统的性能。

select sum(quantity)
from workdata x, work_shift y
where y.team_id = '甲'
and x.recordtime between y.from_date and y.to_date;



我个认为,这是KingSunSha(弱水三千)兄,闯荡csdn这么多年来,最失败的一个答案
蓝天 2002-01-28
  • 打赏
  • 举报
回复

select sum(quntity) from ( select a.workidx workidx, b.quntity quntity, b.recordtime recordtime from WorkTime a,WorkData b where datediff(dd,'20000101',b.recordtime)%8+1=a.idx and a.worktimeidx=
datepart(hh,recordtime)/8+1) x group by x.workidx

用这个试试
蓝天 2002-01-28
  • 打赏
  • 举报
回复
sqlserver2000不是支持函数吗?
做个函数:
输入是时间,输出是班次.
然后用查询就搞定了.
hugeant 2002-01-28
  • 打赏
  • 举报
回复
大家帮我看看啊??????
hugeant 2002-01-28
  • 打赏
  • 举报
回复
升一升
KingSunSha 2002-01-13
  • 打赏
  • 举报
回复
建一个表,结构如下
table work_shift(from_date, to_date, team_id)
from_date to_date team_id
2001/01/01 00:00:00 2001/01/01 07:59:59 甲
2001/01/01 08:00:00 2001/01/01 15:59:59 乙
2001/01/01 16:00:00 2001/01/01 23:59:59 丙
。。。。。

有这样一个表,查询就非常容易了,而且这个表很小,一年才365*3=1095条纪录,根本不影响系统的性能。

select sum(quantity)
from workdata x, work_shift y
where y.team_id = '甲'
and x.recordtime between y.from_date and y.to_date;

xin_ni 2002-01-13
  • 打赏
  • 举报
回复
你的quntity(产量) recordtime(记录时间)是不是表示recordtime的总产量,如果这样的话的确比较辣手。
hugeant 2002-01-13
  • 打赏
  • 举报
回复
KingSunSha(弱水三千)的主意不错,我回去想想试试
rwq_ 2002-01-13
  • 打赏
  • 举报
回复
KingSunSha(弱水三千) 是一个好主意,不然你得把需要求的时间段扩散另一个表表示每个工作组在时间范围!
hugeant 2002-01-13
  • 打赏
  • 举报
回复
其实数据表workdata里10来个字段(quntity1 ~ quntity16),工作人员每10分钟输入一次quntity数据,有的quntity表示该10分钟内的产量,有的表示从年初开始到现在的累计值(一般
是日产量比较少的产品)
昵称被占用了 2002-01-13
  • 打赏
  • 举报
回复
这个问题没说明DBMS,表结构,没法回答!
Soft21 2002-01-13
  • 打赏
  • 举报
回复
大家好啊,这里,妙!

11,849

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 非技术版
社区管理员
  • 非技术版社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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