SQLTeam.com | Weblogs | Forums

Planification

bonjour,
j'aimerais savoir comment planifier une date en se basant sur une table pré-paramétré qui contient un leadtime par opérations et en tenant compte les horaire de travail et les jours fériés ainsi que le week end.
par exemple pour un of créér le 13/02/2021 08:30:
opération 1 : dure 8 h
la date de création correspond a samedi : horaire 7h->15 h
en ajoutant les 8 h a la date de création en utilisant dateadd la requête proposera le 16:30 => dépassement de 1h:30 par rapport horaire de travaille, le lendemain c'est un dimanche (weekend)
j'aurais besoin d'une requête qui exclue les horaires hors services et les weekend de tel sorte que la fin de cette opération soit 15/02/2021 :08:30
merci d'avance pour votre collaborations

Bienvenue, nous n'avons pa acce a ton database. Donc Fourni nous sample data

Create table #sample

Insert into #sample

Bonjour,
merci pour votre réactivité
CREATE TABLE [dbo].[OF](
[ID] [int] IDENTITY(1,1) NOT NULL,
[N_OF] varchar NULL,
[DATE_CR] [datetime] NULL

) ON [PRIMARY]
INSERT INTO [dbo].[OF]
([N_OF]
,[DATE_CR]

 VALUES ('OF00001' ,'2021-02-13 08:30:29.563')

CREATE TABLE [dbo].[SEJOUR](
[ID] [int] NULL,
[OPERATION] varchar NULL,
[LEADTIME] [int] NULL
) ON [PRIMARY]

INSERT INTO [dbo].[SEJOUR](
[OPERATION],
[LEADTIME]
) VALUES ('OP1','8')

à noter qu'on travaille de lundi à samedi de 7h:00 -> 15h:00

tu as testé ton script localement?

Bonjour,
Quel script ?
Je cherche une requête pour calculer la date fin op1 en excluant les jours et heures hors service

le script que tu as poste

Bonjour
Ce script c'est la structure des tables la première contenant la liste des ordres d fabrication avec les date de création relative à chaque of et la deuxième contenant le lead time par operation
Je veut que la requête suggère la date de sortie de chaque opération (date creation+lead time)
Le problème c'est que la date proposé en utilisant dateadd ne prend pas en compte les horaires non travaillées ainsi les dimanche
En tout cas merci pour votre réactivité

dans se forum nous encourageons aux autres de nous donner un sample script. mais avant que nous essayon ce script sur notre sql server, la personne qui demande la question doit faire sure que leur script fonctione proprement sur leur SQL Server. tu comprends ce que j'essaye a te dire?

nous comprenon le resulta que tu veux a la fin. regard/note le script que tu poste. essayes-le sur ton serveur SQL

bonjour,
j'ai trouvé ce script sur le net mais il m'affiche le msg :Msg 242, Niveau 16, État 3, Ligne 25
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.

--set up our source data
declare @business_hours table
(
work_day varchar(10),
open_time varchar(8),
close_time varchar(8)
)
insert into @business_hours values ('Monday', '08:30:00', '17:00:00')
insert into @business_hours values ('Tuesday', '08:30:00', '17:00:00')
insert into @business_hours values ('Wednesday', '08:30:00', '17:00:00')
insert into @business_hours values ('Thursday', '08:30:00', '17:00:00')
insert into @business_hours values ('Friday', '08:30:00', '18:00:00')
insert into @business_hours values ('Saturday', '09:00:00', '14:00:00')

declare @holidays table
(
holiday varchar(10)
)
insert into @holidays values ('2015-01-01')
insert into @holidays values ('2015-01-02')

declare @start_date datetime = '2014-12-31 16:12:47'
declare @time_span int = 960-- time till due in minutes

declare @true bit = 'true'
declare @false bit = 'false'

declare @due_date datetime --our output

--other variables
declare @date_string varchar(10)
declare @today_closing datetime
declare @is_workday bit = @true
declare @is_holiday bit = @false

set @start_date = DATEADD(ss,datepart(ss,@start_date)*-1,@start_date)

while (@time_span > 0)
begin
set @due_date = DATEADD(MINUTE,@time_span,@start_date)
set @date_string = FORMAT(DATEADD(dd, 0, DATEDIFF(dd, 0, @start_date)),'yyyy-MM-dd')
set @today_closing = (select convert(datetime,@date_string + ' ' + close_time) from @business_hours where work_day = DATENAME(weekday,@start_date))

if exists((select work_day from @business_hours where work_day = DATENAME(weekday,@start_date)))
set @is_workday = @true
else
set @is_workday = @false

if exists(select holiday from @holidays where holiday = @date_string)
set @is_holiday = @true
else
set @is_holiday = @false

if @is_workday = @true and @is_holiday = @false
begin
if @due_date > @today_closing
set @time_span = @time_span - datediff(MINUTE, @start_date, @today_closing)
else
set @time_span = @time_span - datediff(minute, @start_date, @due_date)
end

set @date_string = FORMAT(DATEADD(dd, 1, DATEDIFF(dd, 0, @start_date)),'yyyy-MM-dd')
set @start_date = CONVERT(datetime, @date_string + ' ' + isnull((select open_time from @business_hours where work_day = DATENAME(weekday,convert(datetime,@date_string))),''))

end

select @due_date
quelqu'un peut m'aideé
merci d'avance

@midou85 cette nouvelle question est liée à ton question initiale: planification?

Oui c'est dans le même contexte

ca marche pour moi

bizzard
j'ai essayé pas mal de fois sans succès

quel version de SQL?

bonjour,
j'ai trouver la solution merci, j'ai changer le format de la date

re-bonjour,
est ce que c'est possible de stocker ce script en une fonction ou bien une procédure stocké ?

Oui mais tu peux simplifier beacoup plus et elimine tous ces variable. Iya trop.

Quel est le resulta final ? Donnes nous example

pouvez vous m'aidé s'il vous plait

Bien sure. Aide nous a taider

Quel est le resulta final ? Donnes nous example final et data sample

le résultat final et celle de ce script par exemple si l@start_adet=2014-12-31 16:12:47 and @time_span = 5 le résultat due_date sera 2014-12-31 16:12:52 c'est à dire le script va ajouter 5 minute au start_date