简体   繁体   English

如何形成SQL查询

[英]How to form a SQL query

Here is the problem that I need to solve: 这是我需要解决的问题:

This is the table that I need to get for each user. 这是我需要为每个用户获取的表。

Date        | Working time (day) | Night shifts (23:00 - 06:00) | Total(day + night) |             | Notes
3.9.        |    7               |               2              |         9          |      1      | 
4.9.        |    8               |               0              |         8          |             |  
5.9.        |    6               |               2              |         8          |             |
6.9.        |    4               |               3              |         7          |             |
7.9.        |    0               |               0              |         0          |             |
8.9.        |    0               |               0              |         0          |             |
9.9.        |    0               |               0              |         0          |             |
10.9.       |    0               |               0              |         0          |             |
Total(week) |    25              |               7              |         32         |  Total(>48h)|    0    

So let me explain this. 所以让我解释一下。 User chooses the week in this example it is a from 3.9-10.9, user has unique key. 用户在本例中选择周是3.9-10.9,用户有唯一密钥。 Everything in this table needs to be generated in sql if this is possible. 如果可能的话,需要在sql中生成此表中的所有内容。 So the first column is date, second one is a working time which is between (06:00-23:00), third column is night shift between (23:00-06:00), fourth column is Total of day and night shift, fifth column is only filled if fourth column is bigger then 8 ie 9h of total - 8 is 1,sixth column is only filled if Total of(day and night shifts) at the bottom is bigger then 48h and then difference is written in that last column. 所以第一列是日期,第二列是(06:00-23:00)之间的工作时间,第三列是(23:00-06:00)之间的夜班,第四列是白天和晚上的总和移位,第五列仅在第四列大于8时填充,即总共9小时 - 8为1,如果底部的(白天和夜班)总数大于48​​小时,则仅填充第六列,然后写入差异最后一栏。

My current table with data has this columns: user_key,id,time 我当前的数据表包含以下列: user_key,id,time

Now this would be an example of what should query do: 现在这将是查询应该做什么的一个例子:

    1. user_key(100), id(1), time(15:00); 
    2. user_key(200), id(2), time(15:05); 
    3. user_key(100), id(3), time(16:00); 
    4. user_key(100), id(4), time(16:05); 
    5. user_key(100), id(5), time(17:05); 

    3.-1. = 1h 
    5.-4. = 1h 

    Result: 
    user_key(100), day_shift(2h)

So we user_key is unique for each user and id is auto-incrementing, we always need to take first and the second record for the same user and save result and then second two records for that user and save working time and so on... How to achieve this? 所以我们user_key对每个用户都是唯一的,id是自动递增的,我们总是需要为同一个用户取第一个和第二个记录并保存结果,然后为该用户输入第二个记录,节省工作时间等等......怎么做到这一点? I need to use some sql variables? 我需要使用一些sql变量? Of course it has to have to options if it is a day shift and night shift as we don't want to save working time in the wrong column. 当然,如果是白班和夜班,它必须有选项,因为我们不想在错误的列中节省工作时间。

EDIT: 编辑:

As I see that lot of you didn't understood what I really need. 我看到很多人都不理解我真正需要的东西。 I will try to explain it a bit more. 我会尝试解释一下。

When user signs in it has it own user_key written. 当用户登录时,它自己写了user_key。 When he signs out then I wrote user_key(0) in the table after that another user can sing in and so on. 当他注销然后我在表中写了user_key(0)之后另一个用户可以唱歌等等。 So basically I need to see first unique user key in the for example day shift and get the last. 所以基本上我需要在例如白班中看到第一个唯一的用户密钥并获得最后一个。 The last user_key we can get just to check if the next user_key is different. 我们可以得到的最后一个user_key来检查下一个user_key是否不同。 If the next user key is the different then we have the first one and the last one and difference between them needs to be saved in the variable. 如果下一个用户密钥不同,那么我们有第一个用户密钥和最后一个用户密钥,它们之间的差异需要保存在变量中。 Then for example we have some other users and later on we have again pair of user_key then we just need to add the difference between them to the same variable and so on... 然后,例如我们有一些其他用户,稍后我们又有一对user_key然后我们只需要将它们之间的差异添加到同一个变量等等......

My problem can be solved in PHP too. 我的问题也可以在PHP中解决。 For example we can get only values for certain user_key and for the certain time. 例如,我们只能获得某个user_key和特定时间的值。 Then in php we can go trough the data and check. 然后在PHP中我们可以通过数据和检查。

Please provide me with some examples 请提供一些例子

EDIT: 编辑:

Data: 数据:

1447, 0, 2012-10-21 13:32:15.453
1448, 0, 2012-10-21 13:32:22.203
1449, 0, 2012-10-21 13:32:29.203
1450, , 2012-10-21 13:32:35.671
1451, , 2012-10-21 13:32:44.515
1452, , 2012-10-21 13:32:52.62
1453, 0010154108, 2012-10-21 13:32:59.203
1454, 0010154108, 2012-10-21 13:33:06.46
1455, 0010154108, 2012-10-21 13:33:13.171
1456, 0010154108, 2012-10-21 13:33:20.62
1457, 0010154108, 2012-10-21 13:33:27.62
1458, 0010154108, 2012-10-21 13:33:34.171
1459, 0010154108, 2012-10-21 13:33:40.234
1460, 0010154108, 2012-10-21 13:33:47 
1461, 0010154108, 2012-10-21 13:33:53.812
1462, 0010154108, 2012-10-21 13:33:59.828
1463, 0010154108, 2012-10-21 13:34:05.859
1464, 0010154108, 2012-10-21 13:34:11.828
1465, 0010154108, 2012-10-21 13:34:18.843
1466, 0010154108, 2012-10-21 13:34:24.828
1467, 0010154108, 2012-10-21 13:34:30.781
1468, 0010154108, 2012-10-21 13:34:36.765
1469, 0010154108, 2012-10-21 13:34:43.156
1470, 0010154108, 2012-10-21 13:34:49.375
1471, 0010154108, 2012-10-21 13:34:55.593
1472, 0010154108, 2012-10-21 13:35:03.156
1473, 0010154108, 2012-10-21 13:35:10.875
1474, 0010154108, 2012-10-21 13:35:16.734
1475, 0010154108, 2012-10-21 13:35:24.875
1476, 0010154108, 2012-10-21 13:35:31.750
1477, 0010154108, 2012-10-21 13:35:38.765
1478, 0010154108, 2012-10-21 13:35:45.859
1479, 0010154108, 2012-10-21 13:35:54.203
1480, 0010154108, 2012-10-21 13:36:01.62
1481, 0010154108, 2012-10-21 13:36:08.93
1482, 0010154108, 2012-10-21 13:36:15.109
1483, 0010154108, 2012-10-21 13:36:21.109
1484, 0010154108, 2012-10-21 13:36:28.109
1485, 0010154108, 2012-10-21 13:36:34.93
1486, 0010154108, 2012-10-21 13:36:40.93
1487, 0010154108, 2012-10-21 13:36:46.78
1488, 0010154108, 2012-10-21 13:36:54.921
1489, 0010154108, 2012-10-21 13:37:01.93
1490, 0010154108, 2012-10-21 13:37:08.93
1491, 0010154108, 2012-10-21 13:37:14.78
1492, 0010154108, 2012-10-21 13:37:20.78
1493, 0010154108, 2012-10-21 13:37:26.78
1494, 0010154108, 2012-10-21 13:37:33.93
1495, 0010154108, 2012-10-21 13:37:39.140
1496, 0010154108, 2012-10-21 13:37:45.156
1497, 0010154108, 2012-10-21 13:37:51.171
1498, 0010154108, 2012-10-21 13:37:58.562
1499, 0010154108, 2012-10-21 13:38:05.93
1500, 0010154108, 2012-10-21 13:38:11.125
1501, 0010154108, 2012-10-21 13:38:18.109
1502, 0010154108, 2012-10-21 13:38:24.78
1503, 0010154108, 2012-10-21 13:38:30.15
1504, 0010154108, 2012-10-21 13:38:36.15
1505, 0010154108, 2012-10-21 13:38:42.984
1506, 0010154108, 2012-10-21 13:38:48.984
1507, 0010154108, 2012-10-21 13:38:55 
1508, 0010154108, 2012-10-21 13:39:01.750
1509, 0010154108, 2012-10-21 13:39:07.953
1510, 0010154108, 2012-10-21 13:39:13.953
1511, 0010154108, 2012-10-21 13:39:19.984
1512, 0010154108, 2012-10-21 13:39:26 
1513, 0010154108, 2012-10-21 13:39:32.984
1514, 0010154108, 2012-10-21 13:39:38.953
1515, 0010154108, 2012-10-21 13:39:44.937
1516, 0010154108, 2012-10-21 13:39:50.937
1517, 0010154108, 2012-10-21 13:39:57.968
1518, 0010154108, 2012-10-21 13:40:03.968
1519, 0010154108, 2012-10-21 13:40:10.15
1520, 0010154108, 2012-10-21 13:40:16.15
1521, 0010154108, 2012-10-21 13:40:22.968
1522, 0010154108, 2012-10-21 13:40:28.953
1523, 0010154108, 2012-10-21 13:40:34.953
1524, 0010154108, 2012-10-21 13:40:40.984
1525, 0010154108, 2012-10-21 13:40:48 
1526, 0010154108, 2012-10-21 13:40:54.15
1527, 0010154108, 2012-10-21 13:40:59.984
1528, 0010154108, 2012-10-21 13:41:07.578
1529, 0010154108, 2012-10-21 13:41:13.984
1530, 0010154108, 2012-10-21 13:41:20.31
1531, 0010154108, 2012-10-21 13:41:26.31
1532, 0010154108, 2012-10-21 13:41:33.78
1533, 0010154108, 2012-10-21 13:41:39.46
1534, 0010154108, 2012-10-21 13:41:45.31
1535, 0010154108, 2012-10-21 13:41:50.937
1536, 0010154108, 2012-10-21 13:41:57.968
1537, 0010154108, 2012-10-21 13:42:03.953
1538, 0010154108, 2012-10-21 13:42:11.93
1539, 0010154108, 2012-10-21 13:42:17.953
1540, 0010154108, 2012-10-21 13:42:23.968
1541, 0010154108, 2012-10-21 13:42:30.187
1542, 0010154108, 2012-10-21 13:42:37.968
1543, 0010154108, 2012-10-21 13:42:44 
1544, 0010154108, 2012-10-21 13:42:50.15
1545, 0010154108, 2012-10-21 13:42:56 
1546, 0010154108, 2012-10-21 13:43:03.31
1547, 0010154108, 2012-10-21 13:43:08.984
1548, 0010154108, 2012-10-21 13:43:14.984
1549, 0010154108, 2012-10-21 13:43:21.281
1550, 0010154108, 2012-10-21 13:43:28.62
1551, 0010154108, 2012-10-21 13:43:35 
1552, 0010154108, 2012-10-21 13:43:41.78
1553, 0010154108, 2012-10-21 13:43:48.78
1554, 0010154108, 2012-10-21 13:43:54 
1555, 0010154108, 2012-10-21 13:43:59.968
1556, 0010154108, 2012-10-21 13:44:06.62
1557, 0010154108, 2012-10-21 13:44:13.15
1558, 0010154108, 2012-10-21 13:44:19.968
1559, 0010154108, 2012-10-21 13:44:25.984
1560, 0010154108, 2012-10-21 13:44:33.15
1561, 0010154108, 2012-10-21 13:44:39.78
1562, 0010154108, 2012-10-21 13:44:45.46
1563, 0010154108, 2012-10-21 13:44:53.78
1564, 0010154108, 2012-10-21 13:44:59.78
1565, 0010154108, 2012-10-21 13:45:05.437
1566, 0010154108, 2012-10-21 13:45:12.953
1567, 0010154108, 2012-10-21 13:45:19.625
1568, 0010154108, 2012-10-21 13:45:25.937
1569, 0010154108, 2012-10-21 13:45:32.921
1570, 0010154108, 2012-10-21 13:45:38.937
1571, 0010154108, 2012-10-21 13:45:44.890
1572, 0010154108, 2012-10-21 13:45:50.843
1573, 0010154108, 2012-10-21 13:45:57.843
1574, 0010154108, 2012-10-21 13:46:03.843
1575, 0010154108, 2012-10-21 13:46:09.906
1576, 0010154108, 2012-10-21 13:46:15.906
1577, 0010154108, 2012-10-21 13:46:22.921
1578, 0010154108, 2012-10-21 13:46:28.859
1579, 0010154108, 2012-10-21 13:46:34.796
1580, 0010154108, 2012-10-21 13:46:40.703
1581, 0010154108, 2012-10-21 13:46:48.656
1582, 0010154108, 2012-10-21 13:46:54.687
1583, 0010154108, 2012-10-21 13:47:00.671
1584, 0010154108, 2012-10-21 13:47:07.687
1585, 0010154108, 2012-10-21 13:47:13.750
1586, 0010154108, 2012-10-21 13:47:20.265
1587, 0010154108, 2012-10-21 13:47:27.812
1588, 0010154108, 2012-10-21 13:47:33.796
1589, 0010154108, 2012-10-21 13:47:39.781
1590, 0010154108, 2012-10-21 13:47:45.765
1591, 0010154108, 2012-10-21 13:47:52.734
1592, 0010154108, 2012-10-21 13:47:58.781
1593, 0010154108, 2012-10-21 13:48:04.812
1594, 0010154108, 2012-10-21 13:48:10.843
1595, 0010154108, 2012-10-21 13:48:17.843
1596, 0010154108, 2012-10-21 13:48:23.843
1597, 0010154108, 2012-10-21 13:48:29.859
1598, 0010154108, 2012-10-21 13:48:35.890
1599, 0010154108, 2012-10-21 13:48:42.906
1600, 0010154108, 2012-10-21 13:48:48.875
1601, 0010154108, 2012-10-21 13:48:54.890
1602, 0010154108, 2012-10-21 13:49:00.890
1603, 0010154108, 2012-10-21 13:49:07.843
1604, 0010154108, 2012-10-21 13:49:13.890
1605, 0010154108, 2012-10-21 13:49:19.890
1606, 0010154108, 2012-10-21 13:49:28.468
1607, 0010154108, 2012-10-21 13:49:34.500
1608, 0010154108, 2012-10-21 13:49:40.484
1609, 0010154108, 2012-10-21 13:49:46.453
1610, 0010154108, 2012-10-21 13:49:52.859
1611, 0010154108, 2012-10-21 13:49:58.984
1612, 0010154108, 2012-10-21 13:50:04.875
1613, 0010154108, 2012-10-21 13:50:10.875
1614, 0010154108, 2012-10-21 13:50:17.796
1615, 0010154108, 2012-10-21 13:50:23.812
1616, 0010154108, 2012-10-21 13:50:29.796
1617, 0010154108, 2012-10-21 13:50:35.812
1618, 0010154108, 2012-10-21 13:50:42.812
1619, 0010154108, 2012-10-21 13:50:48.828
1620, 0010154108, 2012-10-21 13:50:54.906
1621, 0, 2012-10-21 13:51:00.828
1622, 0, 2012-10-21 13:51:07.890
1623, 0, 2012-10-21 13:51:13.796
1624, 0, 2012-10-21 13:51:19.796
1625, 0, 2012-10-21 13:51:25.812
1626, 0, 2012-10-21 13:51:32.828
1627, 0, 2012-10-21 13:51:38.828
1628, 0, 2012-10-21 13:51:44.796
1629, 0, 2012-10-21 13:51:50.781
1630, 0, 2012-10-21 13:51:57.750
1631, 0, 2012-10-21 13:52:03.718
1632, 0, 2012-10-21 13:52:12.718
1633, 0, 2012-10-21 13:52:18.765
1634, 0, 2012-10-21 13:52:25.46
1635, 0, 2012-10-21 13:52:32.796
1636, 0, 2012-10-21 13:52:39.765
1637, 0, 2012-10-21 13:52:45.781
1638, 0, 2012-10-21 13:52:52.812
1639, 0, 2012-10-21 13:52:59.218
1640, 0, 2012-10-21 13:53:05.250
1641, 0, 2012-10-21 13:53:12.765
1642, 0, 2012-10-21 13:53:18.781
1643, 0, 2012-10-21 13:53:24.875
1644, 0, 2012-10-21 13:53:30.890
1645, 0, 2012-10-21 13:53:37.765
1646, 0, 2012-10-21 13:53:43.750
1647, 0, 2012-10-21 13:53:49.734
1648, 0, 2012-10-21 13:53:55.718
1649, 0, 2012-10-21 13:54:02.859
1650, 0, 2012-10-21 13:54:08.750
1651, 0, 2012-10-21 13:54:14.781
1652, 0, 2012-10-21 13:54:20.750
1653, 0, 2012-10-21 13:54:27.703
1654, 0, 2012-10-21 13:54:33.656
1655, 0, 2012-10-21 13:54:39.671
1656, 0, 2012-10-21 13:54:46.671
1657, 0, 2012-10-21 13:54:53.671
1658, 0, 2012-10-21 13:54:59.656
1659, 0, 2012-10-21 13:55:05.656
1660, 0, 2012-10-21 13:55:12.640
1661, 0, 2012-10-21 13:55:18.640
1662, 0, 2012-10-21 13:55:24.656
1663, 0, 2012-10-21 13:55:30.718
1664, 0, 2012-10-21 13:55:37.703
1665, 0, 2012-10-21 13:55:43.703
1666, 0, 2012-10-21 13:55:49.671
1667, 0, 2012-10-21 13:55:55.609
1668, 0, 2012-10-21 13:56:02.609
1669, 0, 2012-10-21 13:56:08.625
1670, 0, 2012-10-21 13:56:14.625
1671, 0, 2012-10-21 13:56:20.593
1672, 0, 2012-10-21 13:56:27.625
1673, 0, 2012-10-21 13:56:33.687
1674, 0, 2012-10-21 13:56:39.640
1675, 0, 2012-10-21 13:56:45.578
1676, 0, 2012-10-21 13:56:53.703
1677, 0, 2012-10-21 13:56:59.984
1678, 0, 2012-10-21 13:57:07.562
1679, 0, 2012-10-21 13:57:14.562
1680, 0, 2012-10-21 13:57:20.578
1681, 0, 2012-10-21 13:57:27.625
1682, 0, 2012-10-21 13:57:33.609
1683, 0, 2012-10-21 13:57:39.546
1684, 0, 2012-10-21 13:57:47.609
1685, 0, 2012-10-21 13:57:55.765
1686, 0, 2012-10-21 13:58:02.453
1687, 0, 2012-10-21 13:58:08.609
1688, 0, 2012-10-21 13:58:14.484
1689, 0, 2012-10-21 13:58:22.500
1690, 0, 2012-10-21 13:58:28.703
1691, 0, 2012-10-21 13:58:35 
1692, 0, 2012-10-21 13:58:42.656
1693, 0, 2012-10-21 13:58:49.468
1694, 0, 2012-10-21 13:58:55.453
1695, 0, 2012-10-21 13:59:02.453
1696, 0, 2012-10-21 13:59:08.453
1697, 0, 2012-10-21 13:59:14.453
1698, 0, 2012-10-21 13:59:20.453
1699, 0, 2012-10-21 13:59:27.453
1700, 0, 2012-10-21 13:59:33.484
1701, 0, 2012-10-21 13:59:40.515
1702, 0, 2012-10-21 13:59:47.515
1703, 0, 2012-10-21 13:59:53.531
1704, 0, 2012-10-21 14:00:01.437
1705, 0, 2012-10-21 14:00:07.484
1706, 0, 2012-10-21 14:00:13.484
1707, 0, 2012-10-21 14:00:19.500
1708, 0, 2012-10-21 14:00:25.531
1709, 0, 2012-10-21 14:00:32.562
1710, 0, 2012-10-21 14:00:38.531
1711, 0, 2012-10-21 14:00:44.515
1712, 0, 2012-10-21 14:00:50.484
1713, 0, 2012-10-21 14:00:57.531
1714, 0, 2012-10-21 14:01:04.62
1715, 0, 2012-10-21 14:01:09.968
1716, 0, 2012-10-21 14:01:17.531
1717, 0, 2012-10-21 14:01:23.546
1718, 0, 2012-10-21 14:01:29.546
1719, 0, 2012-10-21 14:01:35.531
1720, 0, 2012-10-21 14:01:42.546
1721, 0, 2012-10-21 14:01:48.562
1722, 0, 2012-10-21 14:01:54.531
1723, 0, 2012-10-21 14:02:00.546
1724, 0, 2012-10-21 14:02:07.671
1725, 0, 2012-10-21 14:02:13.468
1726, 0, 2012-10-21 14:02:19.921
1727, 0, 2012-10-21 14:02:27.468
1728, 0, 2012-10-21 14:02:33.484
1729, 0, 2012-10-21 14:02:39.468
1730, 0, 2012-10-21 14:02:45.484
1731, 0, 2012-10-21 14:02:52.484
1732, 0, 2012-10-21 14:02:58.484
1733, 0, 2012-10-21 14:03:04.515
1734, 0, 2012-10-21 14:03:12.500
1735, 0, 2012-10-21 14:03:18.421
1736, 0, 2012-10-21 14:03:24.437
1737, 0, 2012-10-21 14:03:30.734
1738, 0, 2012-10-21 14:03:37.484
1739, 0, 2012-10-21 14:03:43.437
1740, 0, 2012-10-21 14:03:49.437
1741, 0, 2012-10-21 14:03:55.484
1742, 0, 2012-10-21 14:04:02.484
1743, 0, 2012-10-21 14:04:08.453
1744, 0, 2012-10-21 14:04:14.531
1745, 0, 2012-10-21 14:04:20.500
1746, 0, 2012-10-21 14:04:27.484
1747, 0, 2012-10-21 14:04:33.515
1748, 0, 2012-10-21 14:04:39.484
1749, 0, 2012-10-21 14:04:45.375
1750, 0, 2012-10-21 14:04:52.375
1751, 0, 2012-10-21 14:04:58.406
1752, 0, 2012-10-21 14:05:04.421
1753, 0, 2012-10-21 14:05:10.437
1754, 0, 2012-10-21 14:05:17.406
1755, 0, 2012-10-21 14:05:23.421
1756, 0, 2012-10-21 14:05:29.453
1757, 0, 2012-10-21 14:05:35.453
1758, 0, 2012-10-21 14:05:42.468
1759, 0, 2012-10-21 14:05:48.437
1760, 0, 2012-10-21 14:05:54.437
1761, 0, 2012-10-21 14:06:00.453
1762, 0, 2012-10-21 14:06:07.406
1763, 0, 2012-10-21 14:06:13.390
1764, 0, 2012-10-21 14:06:19.343
1765, 0, 2012-10-21 14:06:25.359
1766, 0, 2012-10-21 14:06:32.343
1767, 0, 2012-10-21 14:06:38.343
1768, 0, 2012-10-21 14:06:44.359
1769, 0, 2012-10-21 14:06:50.343
1770, 0, 2012-10-21 14:06:57.343
1771, 0, 2012-10-21 14:07:03.328
1772, 0, 2012-10-21 14:07:09.312
1773, 0, 2012-10-21 14:07:15.343
1774, 0, 2012-10-21 14:07:22.812
1775, 0, 2012-10-21 14:07:29.312
1776, 0, 2012-10-21 14:07:35.328
1777, 0, 2012-10-21 14:07:42.343
1778, 0, 2012-10-21 14:07:48.296
1779, 0, 2012-10-21 14:07:54.343
1780, 0, 2012-10-21 14:08:00.343
1781, 0, 2012-10-21 14:08:07.328
1782, 0, 2012-10-21 14:08:13.312
1783, 0, 2012-10-21 14:08:19.265
1784, 0, 2012-10-21 14:08:26.46
1785, 0, 2012-10-21 14:08:32.296
1786, 0, 2012-10-21 14:08:38.296
1787, 0, 2012-10-21 14:08:44.281
1788, 0, 2012-10-21 14:08:50.296
1789, 0, 2012-10-21 14:08:57.265
1790, 0, 2012-10-21 14:09:03.828
1791, 0, 2012-10-21 14:09:09.937
1792, 0, 2012-10-21 14:09:17.265
1793, 0, 2012-10-21 14:09:23.546
1794, 0, 2012-10-21 14:09:30.468
1795, 0, 2012-10-21 14:09:39.406
1796, 0, 2012-10-21 14:09:49.453
1797, 0, 2012-10-21 14:09:57.562
1798, 0, 2012-10-21 14:10:04.359
1799, 0, 2012-10-21 14:10:15.609
1800, 0, 2012-10-21 14:10:22.187
1801, 0, 2012-10-21 14:10:28.218
1802, 0, 2012-10-21 14:10:34.218
1803, 0, 2012-10-21 14:10:40.296
1804, 0, 2012-10-21 14:10:50.250
1805, 0, 2012-10-21 14:10:57.265
1806, 0, 2012-10-21 14:11:03.125
1807, 0, 2012-10-21 14:11:09.125
1808, 0, 2012-10-21 14:11:15.125
1809, 0, 2012-10-21 14:11:22.125
1810, 0, 2012-10-21 14:11:28.109
1811, 0, 2012-10-21 14:11:35.390
1812, 0, 2012-10-21 14:11:42.15
1813, 0, 2012-10-21 14:11:48.31
1814, 0, 2012-10-21 14:11:54.46
1815, 0, 2012-10-21 14:12:00.78
1816, 0, 2012-10-21 14:12:08.140
1817, 0, 2012-10-21 14:12:14.140
1818, 0, 2012-10-21 14:12:20.171
1819, 0, 2012-10-21 14:12:27.218
1820, 0, 2012-10-21 14:12:33.171
1821, 0, 2012-10-21 14:12:39.125
1822, 0, 2012-10-21 14:12:46 
1823, 0, 2012-10-21 14:12:52.93
1824, 0, 2012-10-21 14:12:58.593
1825, 0, 2012-10-21 14:13:05.484
1826, 0, 2012-10-21 14:13:12.78
1827, 0, 2012-10-21 14:13:18.93
1828, 0, 2012-10-21 14:13:24.109
1829, 0, 2012-10-21 14:13:30.140
1830, 0, 2012-10-21 14:13:37.140
1831, 0, 2012-10-21 14:13:43.203
1832, 0, 2012-10-21 14:13:49.281
1833, 0, 2012-10-21 14:13:57.296
1834, 0, 2012-10-21 14:14:03.203
1835, 0, 2012-10-21 14:14:09.671
1836, 0, 2012-10-21 14:14:17.265
1837, 0, 2012-10-21 14:14:23.171
1838, 0, 2012-10-21 14:14:29.187
1839, 0, 2012-10-21 14:14:35.109
1840, 0, 2012-10-21 14:14:43.484
1841, 0, 2012-10-21 14:14:49.515
1842, 0, 2012-10-21 14:14:57.203
1843, 0, 2012-10-21 14:15:03.187
1844, 0, 2012-10-21 14:15:09.125
1845, 0, 2012-10-21 14:15:17.156
1846, 0, 2012-10-21 14:15:23.140
1847, 0, 2012-10-21 14:15:29.109
1848, 0, 2012-10-21 14:15:35.109
1849, 0, 2012-10-21 14:15:42.125
1850, 0, 2012-10-21 14:15:48.93
1851, 0, 2012-10-21 14:15:54.125
1852, 0, 2012-10-21 14:16:00.109
1853, 0, 2012-10-21 14:16:07.546
1854, 0, 2012-10-21 14:16:14.78
1855, 0, 2012-10-21 14:16:20.156
1856, 0, 2012-10-21 14:16:28.93
1857, 0, 2012-10-21 14:16:34.546
1858, 0, 2012-10-21 14:16:42.62
1859, 0, 2012-10-21 14:16:50.437
1860, 0, 2012-10-21 14:17:13.15
1861, 0, 2012-10-21 14:17:20.593
1862, 0, 2012-10-21 14:17:28.125
1863, 0, 2012-10-21 14:17:35.578
1864, 0, 2012-10-21 14:17:43.125
1865, 0, 2012-10-21 14:17:52.484

Let me recommend these things: 让我推荐这些东西:

  • For each timestamp of a user you should also record whether it is a "checkin" or "checkout". 对于用户的每个时间戳,您还应记录它是“签入”还是“签出”。 Otherwise you will very likely run into troubles. 否则你很可能会遇到麻烦。 For instance a missing timestamp (there can be may reasons for that ...) will totally confuse your evaluation, because the next timestamp of that user will be wrongly interpreted (eg as a "checkout" instead of a "checkin"). 例如,缺少时间戳(可能有原因......)将完全混淆您的评估,因为该用户的下一个时间戳将被错误地解释(例如,作为“结账”而不是“签到”)。
  • I would also consider not to put all evaluation logic into the SQL query. 我还考虑不将所有评估逻辑放入SQL查询中。 Often evaluation logic becomes a lot simpler when doing that in a programming language (php, java, ...). 在编程语言(php,java,...)中执行此操作时,评估逻辑通常会变得更加简单。 Your task seems to be very complex for solving it in SQL only. 您的任务似乎非常复杂,只能在SQL中解决它。 Eg for getting the evaluation of a single day you will have to check for "checkins" of the previous day, whose corresponding "checkout" is on the day you are interested in, etc. 例如,为了获得一天的评估,您必须检查前一天的“签到”,其相应的“结账”是您感兴趣的那天,等等。
  • Make your problem more concise, eg it seems that your days are running from 6am to 6am. 让您的问题更简洁,例如,您的日子似乎从早上6点到早上6点运行。 So working periods (ie matching pairs of "checkin" and "checkout" for the same user) starting at eg 4am and ending at 8am need to be split for your summary? 因此,工作时段(即同一用户的“签到”和“结账”对)从凌晨4点开始到8点结束需要拆分为您的摘要?
  • You should add sanity checks like how long a single working period can be at maximum. 您应该添加完整性检查,例如单个工作时间最长可达多长时间。

I based the answer on the following table structure, that Sir Rufo provided in another answer: 我的答案基于下表结构,Rufo爵士在另一个答案中提供了:

CREATE TABLE `userstamp` (
  `user_key`  int(11) NOT NULL ,
  `id`  int(11) NOT NULL AUTO_INCREMENT ,
  `stamptime`  datetime NOT NULL ,
  PRIMARY KEY (`id`)
);

This VIEW shows every "active" interval, for every user: 此VIEW显示每个用户的每个“活动”间隔:

CREATE VIEW Intervals AS
SELECT
  userstamp.user_key,
  userstamp.stamptime as checkin,
  min(userstamp_2.stamptime) as checkout
FROM
  userstamp inner join userstamp userstamp_2
    on userstamp.user_key = userstamp_2.user_key
WHERE
  userstamp_2.id > userstamp.id
  AND Mod(
    (SELECT
       Count(*)
     FROM
       userstamp as userstamp_1
     WHERE
       userstamp.user_key = userstamp_1.user_key
       AND userstamp.id>userstamp_1.id)
     , 2 ) = 0
GROUP BY
  userstamp.user_key, userstamp.id

the weird SELECT subquery in the WHERE clause is there to get rid of "inactive" intervals (like 16:00 - 16:05) by counting if the checkout time for that user is in an odd row or not. WHERE子句中奇怪的SELECT子查询是通过计算该用户的结账时间是否在奇数行中来消除“非活动”间隔(如16:00 - 16:05)。

Now we have to deal with the fact that an active interval could start in one day, and end in the next day. 现在我们必须处理这样一个事实,即活动间隔可以在一天内开始,并在第二天结束。 This is also the right place to convert dates to seconds. 这也是将日期转换为秒的正确位置。 I would use this VIEW, based on an UNION query: 我将使用此VIEW,基于UNION查询:

CREATE VIEW intervals_2 AS
SELECT
  user_key,
  CAST(checkin AS DATE) AS day,
  TIME_TO_SEC(CAST(checkin AS TIME)) AS checkinsec,
  TIME_TO_SEC(CAST(checkout AS TIME)) AS checkoutsec
FROM intervals WHERE CAST(checkin AS date) = CAST(checkout AS date)
UNION
SELECT
   user_key,
   CAST(checkin AS date) AS day,
   TIME_TO_SEC(CAST(checkin AS TIME)) AS checkinsec,
   86400 AS checkoutsec
FROM intervals WHERE CAST(checkin AS date) < CAST(checkout AS date)
UNION
SELECT
  user_key,
  CAST(checkout AS DATE) AS day,
  0 AS checkinsec,
  TIME_TO_SEC(CAST(checkout AS TIME)) AS checkoutsec
FROM intervals WHERE CAST(checkin AS date) < CAST(checkout AS date)

Okay! 好的! Now we are ready to do some basic sum. 现在我们准备做一些基本的总和。 This one is to calculate the sum of each day: 这个是计算每一天的总和:

SELECT
  user_key,
  day,
  SEC_TO_TIME( SUM(IF(checkinsec<82800 and checkoutsec>21600,LEAST(82800, checkoutsec) - GREATEST(21600, checkinsec),0))) as WorkHours,
  SEC_TO_TIME( SUM(IF(checkinsec<21600, 21600-checkinsec, 0)+IF(checkoutsec>82800, checkoutsec-GREATEST(82800, checkinsec), 0))) as NightShift,
  SEC_TO_TIME( SUM(checkoutsec-checkinsec) ) as TotalDay
FROM
  intervals_2
WHERE
  day BETWEEN startdate AND enddate
GROUP BY
  user_key,
  day

but if you just need the sum of the whole week you can remove the DATE(checkin) from the field and from the GROUP BY. 但如果您只需要整周的总和,则可以从字段和GROUP BY中删除DATE(签入)。

I have a Stored Procedure for you that can handle this and returns a table result. 我有一个存储过程,可以处理这个并返回一个表结果。 IMHO a normal SQL Query cannot handle this, because you have to parse through every record and toggle the states "come" and "go". 恕我直言,一个普通的SQL查询无法处理这个,因为你必须解析每个记录并切换状态“来”和“去”。

Here is the Table Layout for the SP 这是SP的表格布局

CREATE TABLE `userstamp` (
`user_key`  int(11) NOT NULL ,
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`stamptime`  datetime NOT NULL ,
PRIMARY KEY (`id`)
);

calling the SP looks like 调用SP看起来像

CALL get_user_result( 100, '2012-09-03', '2012-09-10' );

and here is the SP 这是SP

DROP PROCEDURE IF EXISTS `get_user_result`;
DELIMITER ;;
CREATE PROCEDURE `get_user_result`(IN Auser_key INT, IN AStartDate DATE, IN AEndDate DATE)
BEGIN

DECLARE done INT DEFAULT 0;
DECLARE LKnownUser INT DEFAULT 0;
DECLARE LCstampdate DATE;
DECLARE LCuser_key INT;
DECLARE Lday_shift_inc, Lnight_shift_inc DECIMAL( 9, 6 ) DEFAULT 0; -- CHANGE
DECLARE LCstamptime, Lstamptime DATETIME;

DECLARE c_ustamp CURSOR FOR SELECT user_key, stamptime FROM userstamp WHERE user_key = Auser_key AND stamptime >= ADDDATE( AStartDate, INTERVAL 6 HOUR ) AND stamptime < ADDDATE( DATE_ADD( AEndDate, INTERVAL 6 HOUR ), 1 ) ORDER BY user_key,stamptime;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

DROP TEMPORARY TABLE IF EXISTS user_result;

CREATE TEMPORARY TABLE user_result (
`stampdate`  date NULL DEFAULT NULL ,
`user_key`  int(11) NOT NULL ,
`day_shift`  decimal(9,6) NOT NULL DEFAULT 0.00 , -- CHANGE
`night_shift`  decimal(9,6) NOT NULL DEFAULT 0.00 , -- CHANGE
`stamptime`  datetime NULL DEFAULT NULL ,
PRIMARY KEY (`stampdate`,`user_key`)
);

OPEN c_ustamp;

REPEAT

    FETCH c_ustamp INTO LCuser_key, LCstamptime;

    IF NOT done THEN

        IF ( TIME( LCstamptime ) >= MAKETIME(00,00,00) ) AND ( TIME( LCstamptime ) < MAKETIME(06,00,00) ) THEN
            SET LCstampdate = DATE_SUB( DATE( LCstamptime ), INTERVAL 1 DAY );
        ELSE
            SET LCstampdate = DATE( LCstamptime );
        END IF;

        SELECT COUNT(*)
        INTO LKnownUser
        FROM user_result
        WHERE stampdate = LCstampdate AND user_key = LCuser_key;

        IF NOT LKnownUser THEN

            INSERT INTO user_result
                SET stampdate = LCstampdate, user_key = LCuser_key, stamptime = LCstamptime, day_shift = 0, night_shift = 0;

        ELSE

            SELECT stamptime
            INTO Lstamptime
            FROM user_result
            WHERE stampdate = LCstampdate AND user_key = LCuser_key;

            IF Lstamptime IS NULL THEN

                UPDATE user_result
                SET stamptime = LCstamptime
                WHERE stampdate = LCstampdate AND user_key = LCuser_key;

            ELSE

                IF ( TIME( Lstamptime ) >=  MAKETIME(06,00,00) ) AND ( TIME( Lstamptime ) < MAKETIME(23,00,00) )
                THEN -- day_shift 06:00:00 til 23:00:00
                    SET Lday_shift_inc = TIME_TO_SEC( TIMEDIFF( LCstamptime, Lstamptime ) ) / 3600.0; -- CHANGE
                    SET Lnight_shift_inc = 0;
                ELSE -- night_shift
                    SET Lday_shift_inc = 0;
                    SET Lnight_shift_inc = TIME_TO_SEC( TIMEDIFF( LCstamptime, Lstamptime ) ) / 3600.0; -- CHANGE
                END IF;

                UPDATE user_result
                SET 
                    day_shift = day_shift + Lday_shift_inc,
                    night_shift = night_shift + Lnight_shift_inc,
                    stamptime = NULL
                WHERE stampdate = LCstampdate AND user_key = LCuser_key;

            END IF;

        END IF;

    END IF;

UNTIL done END REPEAT;

CLOSE c_ustamp;

SELECT stampdate, user_key, day_shift, night_shift
FROM user_result
WHERE day_shift + night_shift > 0;

DROP TEMPORARY TABLE IF EXISTS user_result;

END;;
DELIMITER ;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM