Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 server 连续多天超过午夜查询_Sql Server_Tsql - Fatal编程技术网

Sql server 连续多天超过午夜查询

Sql server 连续多天超过午夜查询,sql-server,tsql,Sql Server,Tsql,这就是我的问题 在firstshift下,查询运行良好。但是对于第二班,我必须分两部分跑,因为时间已经过了午夜 我想在一个查询中运行第二个班次,因为我必须将所有数据粘贴到电子表格中,但第二个班次只能粘贴两次,然后进行排序。我尝试了多种解决方案,但要么没有结果,要么没有错误 请注意,我会根据请求一周一周地工作,而不是每周都从同一天开始,或者可能只是几天,或者在一种情况下是一个月。对于我输入的日期范围,这三个都可以根据需要工作,但如果我能在第二个班次运行一个查询,那就太好了。第二班时间为下午5点至凌

这就是我的问题

在firstshift下,查询运行良好。但是对于第二班,我必须分两部分跑,因为时间已经过了午夜

我想在一个查询中运行第二个班次,因为我必须将所有数据粘贴到电子表格中,但第二个班次只能粘贴两次,然后进行排序。我尝试了多种解决方案,但要么没有结果,要么没有错误

请注意,我会根据请求一周一周地工作,而不是每周都从同一天开始,或者可能只是几天,或者在一种情况下是一个月。对于我输入的日期范围,这三个都可以根据需要工作,但如果我能在第二个班次运行一个查询,那就太好了。第二班时间为下午5点至凌晨4点或1700至0400军事时间

提前谢谢

   SELECT TOP (100000) 
   [line_ID]
  ,[VIN]
  ,[sequence]
  ,[load_time]

----------------First Shift-------------------------------

 FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
 WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= D 
 ATEADD(day,1,'10/14/2018') 
 AND DATEPART(hour,load_time) >= 5 AND DATEPART(hour,load_time) <= 16
 order by load_time


-------------Second Shift----------------------------------

-------------NEED TO RUN THE TIME PARTS INDEPENDANTLY------
SELECT TOP (100000) 
   [line_ID]
  ,[VIN]
  ,[sequence]
  ,[load_time]


FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= 
DATEADD(day,1,'10/14/2018') 
AND DATEPART(hour,load_time) >= 17 AND DATEPART(hour,load_time) <= 2359
order by load_time


SELECT TOP (100000) 
   [line_ID]
  ,[VIN]
  ,[sequence]
  ,[load_time]

FROM [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE line_ID = 100 and  load_time > '10/08/2018' AND load_time <= 
DATEADD(day,1,'10/14/2018') 
AND DATEPART(hh,load_time) >= 0 AND DATEPART(hh,load_time) <= 4
order by load_time

如果您的查询返回正确的结果,那么简单而俗气的方法是UNION ALL:

提示1 我添加了一个Querymarker列,它允许您查看哪个查询返回了一行,但这可能不需要,您可以删除它

提示2
您应该避免依赖于区域性的日期格式。2018年8月10日可以是8月10日或10月8日,具体取决于您的机器设置。尝试使用独立设置,在您的情况下,我倾向于取消将“20181008”与引号分开,在任何情况下,这将是10月8日。

以下方法将动态生成一组代表2 x 12小时轮班的行,以覆盖日期范围:

declare @start as datetime = '20180901 00:00:00'
declare @finish as datetime = '20181001 00:00:00'

;WITH digits AS (
      SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
      SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
      )
, tally AS (
      SELECT 
              d1s.n 
            + d10s.n * 10
            --+ d100s.n * 100  /* add more like this as needed */
            --+ d1000s.n * 1000  /* add more like this as needed */
            AS n
      FROM digits d1s
      CROSS JOIN digits d10s
      --CROSS JOIN digits d100s /* add more like this as needed */
      --CROSS JOIN digits d1000s /* add more like this as needed */
      )
, range as (
    select
         n
       , dateadd(hour,5,dateadd(day,n-1,@start))  shift1_start
       , dateadd(hour,17,dateadd(day,n-1,@start)) shift2_start
       , dateadd(hour,29,dateadd(day,n-1,@start)) next_shift1_start
    from tally
    where dateadd(day,n-1,@start) <= @finish
    )
select t.*
from range
inner join [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in] AS t 
    ON t.load_time >= range.shift2_start and t.load_time < next_shift1_start
order by t.load_time
使用此方法解决您的问题允许您在单个查询中选择单个班次的数据,或在单个查询中通过两个班次区分数据。

您只需在where子句中添加or,即可包含两组允许的小时数:

select
*
from [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE load_time > '10/08/2018' 
AND load_time <=  DATEADD(day,1,'10/14/2018') 
AND ((DATEPART(hour,load_time) >= 0 AND DATEPART(hh,load_time) <= 4)
   OR
     (DATEPART(hour,load_time) >= 17 AND DATEPART(hour,load_time) <= 23)
     )
order by load_time
;

另请参见:

对的回答可能会有所帮助。样本数据和预期结果将大大有助于达成一致。获取根据需要编辑问题的提示。dateparthour如何返回大于23的值?当然,heck无法达到2359,这非常有效。事实上,我删除了Querymaker部分。这么简单…感谢答案,但不是我想要的结果。第一个回答就像我也需要它一样有效,而且非常简单。我已经修改了答案。这种方法——尽管看起来更复杂,但确实给了您更大的灵活性。我还添加了一个不需要工会的更简单的替代方案。是的。这也行。我没有做很多复杂的数据库查询,但我认为我想得太多了。
       n       shift1_start          shift2_start        next_shift1_start      
 ---- ---- --------------------- --------------------- --------------------- 
   1    0   31.08.2018 05:00:00   31.08.2018 17:00:00   01.09.2018 05:00:00  
   2    1   01.09.2018 05:00:00   01.09.2018 17:00:00   02.09.2018 05:00:00  
...
  31   30   30.09.2018 05:00:00   30.09.2018 17:00:00   01.10.2018 05:00:00  
  32   31   01.10.2018 05:00:00   01.10.2018 17:00:00   02.10.2018 05:00:00 
select
*
from [NYSUS_SEQUENCE_MES].[dbo].[broadcasts_in]
WHERE load_time > '10/08/2018' 
AND load_time <=  DATEADD(day,1,'10/14/2018') 
AND ((DATEPART(hour,load_time) >= 0 AND DATEPART(hh,load_time) <= 4)
   OR
     (DATEPART(hour,load_time) >= 17 AND DATEPART(hour,load_time) <= 23)
     )
order by load_time
;