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