SQL-将时间戳查询到存储桶中
我的SQL经验仅限于基本的查询,我所学到的一切都是通过GoogleFu(主要是从这个网站),通过反复试验,出于必要,所以请原谅我的解释不够清晰 数据:表dbo。[卸载]包含每个部件的唯一标识符[ID]和部件完成时的[Timestamp] 示例数据:SQL-将时间戳查询到存储桶中,sql,sql-server,Sql,Sql Server,我的SQL经验仅限于基本的查询,我所学到的一切都是通过GoogleFu(主要是从这个网站),通过反复试验,出于必要,所以请原谅我的解释不够清晰 数据:表dbo。[卸载]包含每个部件的唯一标识符[ID]和部件完成时的[Timestamp] 示例数据: ID TimeStamp 310963627 2018-01-10 15:30:21.000 310963562 2018-01-10 15:29:47.000 310963595 2018-01-10 15:29:04
ID TimeStamp
310963627 2018-01-10 15:30:21.000
310963562 2018-01-10 15:29:47.000
310963595 2018-01-10 15:29:04.000
310963517 2018-01-10 15:28:21.000
310963548 2018-01-10 15:27:41.000
310963469 2018-01-10 15:27:02.000
310963500 2018-01-10 15:26:17.000
310963436 2018-01-10 15:25:39.000
310963422 2018-01-10 15:24:58.000
编辑:展开的示例数据:
我提出了一个查询,该查询将按班次和最后一站行时间戳的日期对生产的零件数量进行分组:
班次:
Shift 1st 2nd 3rd
Start 6:30 AM 2:30 PM 10:30 PM
End 2:30 PM 10:30 PM 6:30 AM
Hours 8:00 8:00 8:00
*第三场比赛前一天晚上10:30开始-ex:2018-01-10:3rd=2018-01-09 22:30:00.0000至2018-01-10 06:30:00.0000
SELECT
[Shift],
Count([ID]) as Assembled
FROM(
SELECT _60.*,
CASE WHEN (
CONVERT(CHAR(5), Timestamp, 114) between '06:30' and '14:30'
)
THEN LEFT(CAST(TimeStamp AS DATE),10)+':1st'
WHEN (
CONVERT(CHAR(5), Timestamp, 114) between '14:30' and '22:30'
)
THEN LEFT(CAST(TimeStamp AS DATE),10)+':2nd'
WHEN (
CONVERT(CHAR(5), Timestamp, 114) between '22:30' and '24:00'
)
THEN LEFT(CAST(DATEADD(DAY, 1, TimeStamp) AS DATE),10)+':3rd'
WHEN (
CONVERT(CHAR(5), Timestamp, 114) between '00:00' and '06:30'
)
THEN LEFT(CAST(DATEADD(DAY, 0, TimeStamp) AS DATE),10)+':3rd'
END AS [Shift]
FROM dbo.Offload _60
) _60
where TimeStamp > (DATEADD(DAY, -150, GETDATE()))
GROUP BY [Shift]
order by CAST(LEFT([shift],10) as date) desc
目前的结果:
Shift Assembled
2018-01-10:1st 389
2018-01-10:2nd 39
2018-01-10:3rd 406
2018-01-09:1st 245
2018-01-09:2nd 334
2018-01-09:3rd 125
2018-01-08:1st 441
2018-01-08:2nd 263
2018-01-08:3rd 430
2018-01-07:1st 390
2018-01-07:2nd 456
2018-01-07:3rd 152
预期结果:
1st 2nd 3rd
2018-01-10 389 39 406
2018-01-09 245 334 125
2018-01-08 441 263 430
2018-01-07 390 456 152
我不知道从这里到哪里去;我不知道某种形式的支点是我的解决方案还是类似“这个”的东西。我已尝试按日期和第三次休息时间每天分成两个条目。此解决方案应该可以:
SELECT
CAST(DATEADD(MINUTE, -390, TimeStamp) AS DATE) AS [Date]
, SUM(CASE
WHEN CAST(TimeStamp AS TIME) BETWEEN '06:30:00.000' AND '14:29:59.999'
THEN 1
ELSE 0
END) AS [1st]
, SUM(CASE
WHEN CAST(TimeStamp AS TIME) BETWEEN '14:30:00.000' AND '22:29:59.999'
THEN 1
ELSE 0
END) AS [2nd]
, SUM(CASE
WHEN CAST(TimeStamp AS TIME) < '06:30:00.000'
OR CAST(TimeStamp AS TIME) >= '22:30:00.000'
THEN 1
ELSE 0
END) AS [3rd]
FROM Offload
GROUP BY CAST(DATEADD(MINUTE, -390, TimeStamp) AS DATE)
它将返回
Date 1st 2nd 3rd
---------- ----------- ----------- -----------
2018-01-09 0 0 4
2018-01-10 1 11 1
需要注意的是:我假设晚上10:30到早上6:30的班次是前一天的一部分。如果希望它成为第二天的一部分,请在DATEADD
函数中去掉-390
中的减号
还考虑用函数替换 CASE < /Code >语句,发现代码更可读,SQLServer管理Studio不喜欢用
CASE < /Code >调试问题。
如果有什么不清楚的地方,请留下评论。我最后创建了两列[Shift]和[ShiftDate];[Shift]标识第1、第2、第3和[Shift-Date]将第3部分中跨越午夜的部分提前。克里斯的回答让我走上了正确的道路。谢谢
CASE WHEN (CONVERT(CHAR(8), Timestamp, 114) between '06:30:00' and '14:30:00') THEN '1'
WHEN (CONVERT(CHAR(8), Timestamp, 114) between '14:30:00' and '22:30:00') THEN '2'
WHEN (CONVERT(CHAR(8), Timestamp, 114) between '22:30:00' and '24:00:00') THEN '3'
WHEN (CONVERT(CHAR(8), Timestamp, 114) between '00:00:00' and '06:30:00') THEN '3'
END AS [Shift]
,CASE WHEN (CONVERT(CHAR(8), Timestamp, 114) between '06:30:00' and '14:30:00') THEN convert(varchar, CAST(TimeStamp AS DATE), 1)
WHEN (CONVERT(CHAR(8), Timestamp, 114) between '14:30:00' and '22:30:00') THEN convert(varchar, CAST(TimeStamp AS DATE), 1)
WHEN (CONVERT(CHAR(8), Timestamp, 114) between '22:30:00' and '24:00:00') THEN convert(varchar, CAST(DATEADD(DAY, 1, TimeStamp) AS DATE), 1)
WHEN (CONVERT(CHAR(8), Timestamp, 114) between '00:00:00' and '06:30:00') THEN convert(varchar, CAST(TimeStamp AS DATE), 1)
END AS [ShiftDate]
然后分组:
GROUP by [ShiftDate] ,[Shift]
ORDER by [ShiftDate] desc
你要找的应该是某种形式的支点,是的。使用链接示例中的
MAX
而不是SUM
(例如MAX(右边的情况下(Shift,3)='1st',然后组合结束)…按子字符串分组(Shift,1,10)
或使用实际的PIVOT
语法。我强烈建议不要将日期和字符串连接到shift
列中,但这会使您的PIVOT更加困难。感谢您的回答,我处理这个问题的方法是错误的,这是一个更干净的解决方案。不过,一个问题是第二个的数字是倾斜的ed有一点。1号和3号现在是正确的(手动检查),但2号高于/低于预期,我无法找出原因。(上面附加的扩展数据集)
GROUP by [ShiftDate] ,[Shift]
ORDER by [ShiftDate] desc