Выберите записи между 3 различными рабочими сменами? - PullRequest
0 голосов
/ 03 марта 2020

У меня есть таблица данных под названием «Запросы», в которой записываются запросы, сделанные сотрудниками компании, я использовал хранимую процедуру для получения всех запросов за один рабочий день (начиная с 6 утра и заканчивая в 6 утра следующего день)

USE [DataBase]
GO
/****** Object:  StoredProcedure [dbo].[SP_GetRequests]  ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[SP_GetRequests]
as begin
DECLARE @from datetime 
set @from = getdate();
if (DATEPART(HOUR, @from) < 6) set @from = dateadd(day, -1, @from);

DECLARE @start_date datetime = CONVERT(datetime, CONVERT(char(9), @from, 112) + '06:00');
DECLARE @end_date datetime = DATEADD(HOUR, 24, @start_date)

select * FROM Requests
where RequestDate between  @start_date and @end_date
end

Теперь мне нужна еще одна хранимая процедура, чтобы получить все запросы от определенной c рабочей смены.

Компания работает в 3 рабочих смены (1-е: с 6:00 до 14:00 / 2-е: с 14:00 до 22:00 / 3: с 22:00 до 6:00).

Есть ли способ получить все запросы от одного сдвиг?

Например: если текущее время 5:00, показывать только запросы с 3-й смены (с 22:00 до 6:00), и если это 15:00, показывать только запросы со 2-й смены (с 14:00 до 22:00)

1 Ответ

0 голосов
/ 04 марта 2020

Вот быстрый сценарий, с которого можно начать.

Use AdventureWorks2017;
Go
If OBJECT_ID ('tempdb..#Requests') is not null Drop Table #Requests
Create Table #Requests (id int identity (1,1) primary key, [Name] varchar (1), DateTime1 Datetime)
Insert into #Requests ([Name], DateTime1)
Select 'A', '2020-04-03 07:00' UNION ALL
Select 'B', '2020-04-03 15:00' UNION ALL
Select 'C', '2020-04-03 23:00'


Declare @timeofinterest datetime
--Set @timeofinterest = GetDate()
Set @timeofinterest = '2020-04-03 12:00'
--Set @timeofinterest = '2020-04-03 18:00'
--Set @timeofinterest = '2020-04-03 02:00'

If cast(@timeofinterest as time) between '06:00' and '14:00'
Begin
Select *
from #Requests
where cast(DateTime1 as time) between '06:00' and '14:00'
and cast(Datetime1 as date) = cast(@timeofinterest as date)
End
If cast(@timeofinterest as time) between '14:00' and '22:00'
Begin
Select *
From #Requests
where cast(DateTime1 as time) between '14:00' and '22:00'
and cast(Datetime1 as date) = cast(@timeofinterest as date)
End

If cast(@timeofinterest as time) between '22:00' and '23:59' or cast(@timeofinterest as time) between '00:01' and '06:00'
Begin
Select *
From #Requests
where cast(DateTime1 as time) between '22:00' and '23:59' or cast(DateTime1 as time) between '00:01' and '06:00'
and cast(Datetime1 as date) = cast(@timeofinterest as date)
End

Функциональность около полуночи требует немного работы, но для возврата соответствующих записей используется оператор if… else. Если время в смене x, то будут возвращаться только записи из этой смены.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...