Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将时间戳查询到存储桶中_Sql_Sql Server - Fatal编程技术网

SQL-将时间戳查询到存储桶中

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

我的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.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