Sql 基于轴承移动的查询-他们工作了多少班次?
我在一家制造业的同事轮班工作的公司工作。换档系统可能每个月都不同。所以这两个家伙可能只在晚上工作一周,但下个星期会早晚工作 现在我有了一个数据库,在那里我可以看到同事们每天都在制作什么。基本上,我只能看到轴承的运动。理论上,我现在可以说,在2017年4月27日,他们分三班工作,因为在今天早上6:00-2:00,下午2:00-10:00和晚上10:00-6:00之间,我们的轴承在移动。每小时有数百个轴承移动 我现在想做的是:我想知道这些人每个月工作多少班。所以最好的结果是,如果我能得到一个查询,它会给我一个月的编号和下一列这个月的班次数量 我猜查询必须检查一个月的每一天,检查每个可能的班次是否有条目,如果有,那么就数一个计数器或其他什么 表架构:Sql 基于轴承移动的查询-他们工作了多少班次?,sql,sql-server,Sql,Sql Server,我在一家制造业的同事轮班工作的公司工作。换档系统可能每个月都不同。所以这两个家伙可能只在晚上工作一周,但下个星期会早晚工作 现在我有了一个数据库,在那里我可以看到同事们每天都在制作什么。基本上,我只能看到轴承的运动。理论上,我现在可以说,在2017年4月27日,他们分三班工作,因为在今天早上6:00-2:00,下午2:00-10:00和晚上10:00-6:00之间,我们的轴承在移动。每小时有数百个轴承移动 我现在想做的是:我想知道这些人每个月工作多少班。所以最好的结果是,如果我能得到一个查询,它
TABLE_NAME lb
COLUMN_NAME DATA_TYPE
id int
date_ datetime
time_ time
doc varchar
pgroup int
piece varchar
amount decimal
name1 varchar
name2 varchar
name3 varchar
storage_location int
bs varchar
hash varchar
inserted datetime
edited datetime
仅来自列ID、日期和时间的样本数据_
ID date_ time_
1 2017-02-06 00:00:00.000 10:05:34.0000000
2 2017-02-02 00:00:00.000 09:15:31.0000000
3 2017-02-02 00:00:00.000 16:19:12.0000000
4 2017-01-30 00:00:00.000 14:15:01.0000000
5 2017-01-30 00:00:00.000 21:35:10.0000000
6 2017-01-31 00:00:00.000 05:33:20.0000000
7 2017-01-31 00:00:00.000 05:36:07.0000000
8 2017-01-31 00:00:00.000 14:33:56.0000000
9 2017-01-30 00:00:00.000 06:25:25.0000000
10 2017-01-30 00:00:00.000 10:05:29.0000000
11 2017-01-30 00:00:00.000 15:25:26.0000000
12 2017-01-30 00:00:00.000 17:35:29.0000000
13 2017-01-30 00:00:00.000 21:05:26.0000000
14 2017-01-31 00:00:00.000 00:45:44.0000000
15 2017-01-30 00:00:00.000 08:15:25.0000000
16 2017-01-30 00:00:00.000 10:05:32.0000000
17 2017-01-30 00:00:00.000 15:25:29.0000000
18 2017-01-30 00:00:00.000 17:35:32.0000000
19 2017-01-30 00:00:00.000 21:05:30.0000000
20 2017-01-31 00:00:00.000 00:45:53.0000000
基于样本数据的输出:
month shifts
2 3
1 4
这可能吗?你可以试试这样的东西
SELECT monthday AS "month", COUNT(monthday) AS "shifts" FROM
(SELECT date_trunc( 'month', date ) FROM
(SELECT DISTINCT date FROM lb
WHERE '06:00:00'::time <= time AND time < '14:00:00'::time
UNION ALL
SELECT DISTINCT date FROM lb
WHERE '14:00:00'::time <= time AND time < '22:00:00'::time
UNION ALL
SELECT DISTINCT date FROM lb
WHERE '22:00:00'::time <= time AND time < '06:00:00'::time
) shiftdays
) monthdays (monthday) GROUP BY monthday;
由于手机的原因,我没有时间检查它的语法是否正确。
另外,这是PostgreSQL语法,请根据您的SQL方言进行调整
它是如何工作的?
此项选择第一个班次中的所有日期。每天只有一次不同
SELECT DISTINCT date FROM lb
WHERE '06:00:00'::time <= time AND time < '14:00:00'::time
其他班次也一样。
然后,这三个班次的日子就被扔进了同一个碗里。
如果你把同一天扔进两次,它也会在碗里丢两次;我不想说group,因为group在SQL中已经有了不同的含义
现在我们有了一年中所有可能的天数,或者至少表中所有的天数行。每天显示0显示表架构。。此外,样本数据和期望的输出都取决于表结构和一些数据。如何存储班次、日期时间和其他详细信息?系统必须有班次主数据,并且班次ID必须存储在考勤表中。因此,此查询很简单。添加了一些更多信息显示您是否确定班次?所有的员工都在同一时间登记入住和退房吗?不,这不重要。这些数据与员工的入住登记无关。我只需要一个计数器,它对一个月的每一天执行以下-->遍历该月的所有天,查找,如果至少有一个条目在早上6点到下午2点之间,则计数+1,如果至少有一个条目在下午2点到晚上10点之间,则计数+1,如果至少有一个条目在晚上10点到早上6点之间,然后数到+1。在一个月的每一天都这样做。打印月号和计数器。谢谢!将在本周后进行测试1谢谢!改变了它一点,它的工作像魅力!