janvier
2011
Quelques UDFs date/heure
–==================================================================================
– Description : Trouver le nombre de secondes à partir d'une heure donnée
– SQL SERVER 2008 +
– Auteur : Etienne ZINZINDOHOUE
– Exemples d'utilisation :
— SELECT dbo.F_Time_to_Second(‘2011-01-12 19:38:41.250123′)
— OU
— SELECT dbo.F_Time_to_Second(’19:38:41.250123′)
–==================================================================================
CREATE FUNCTION dbo.F_Time_to_Second(@time time)
RETURNS DECIMAL(18,10) AS
BEGIN
DECLARE @Second INT
DECLARE @Minute INT
DECLARE @Heure INT
DECLARE @Nanosecond INT
DECLARE @NbSeconds decimal(18,10)
SET @time = LTRIM(RTRIM(@time))
– Validiter de l'heure saisie ?
IF ((@time < cast('00:00:00.0000000' as time(7))) OR (@time > cast('23:59:59.9999999' as time))) RETURN( -1)
– Supprimer les espaces
SET @Heure = CONVERT(int,DATEPART (HOUR,@time))
SET @Minute = CONVERT(int,DATEPART (MINUTE,@time))
SET @Second = CONVERT(int,DATEPART (SECOND,@time))
SET @Nanosecond = CONVERT(int,DATEPART (NANOSECOND,@time))
SET @NbSeconds = (@Heure * 3600 )+ (@Minute * 60) + @Second + @Nanosecond*(1E-9 )
RETURN @NbSeconds
END
–==================================================================================
– Description : Trouver l'heure (HH:MM:SS.FFFFFFFFF) à partir du nombre de secondes
– Auteur : Etienne ZINZINDOHOUE
– Exemples d'utilisation : SELECT dbo.F_Second_to_Time(70721)
— OU
— SELECT dbo.F_Second_to_Time(70721.083210)
–==================================================================================
CREATE FUNCTION dbo.F_Second_to_Time(@NbSeconds decimal(18,10))
RETURNS VARCHAR (100) AS
BEGIN
DECLARE @TIME VARCHAR(50)
DECLARE @HH INT
DECLARE @MM INT
DECLARE @SS INT
DECLARE @F varchar(20) – Fraction de seconde
DECLARE @Chaine VARCHAR(255)
– Supprimer les espaces
SET @NbSeconds = LTRIM(RTRIM(@NbSeconds))
– Validiter du nombre de secondes. Le nombre de secondes doit tre positif et <= 86400
IF (@NbSeconds > 86400 OR @NbSeconds < 0 ) RETURN ('Le nombre de secondes doit tre compris entre 0 et 86400')
– Extraire la fraction de seconde
SET @Chaine = CONVERT(varchar(255),@NbSeconds)
SET @F = CONVERT(varchar(20),SUBSTRING (@Chaine,PATINDEX ( '%.%' , @Chaine)+1,(LEN(@Chaine)- PATINDEX ( '%.%' , @Chaine))))
– construire le time
SELECT @HH = @NbSeconds / 3600, @MM = (@NbSeconds%3600) / 60, @SS = (@NbSeconds%60)
SET @TIME = CONVERT(varchar(10),(RIGHT('0'+ CONVERT(char(2),@HH),2)+':'+ RIGHT('0'+ CONVERT(char(2),@MM),2)+':'+ RIGHT('0'+ CONVERT(char(2),@SS),2))) +'.'+@F
RETURN @TIME
END
–==================================================================================
– Description : Trouver la date à partir du nombre de jours
– Auteur : Etienne ZINZINDOHOUE
– Exemple d'utilisation : SELECT dbo.F_Search_date(40553)
–==================================================================================
CREATE FUNCTION dbo.F_Search_date (@NBJOURS INT)
RETURNS VARCHAR(40) AS
BEGIN
DECLARE @YYYYMMDD VARCHAR(10)
DECLARE @HH INT
DECLARE @MM INT
DECLARE @SS INT;
– Supprimer les espaces
SELECT @NBJOURS = LTRIM(RTRIM(@NBJOURS))
IF (@NBJOURS < 0 ) RETURN ('Le nombre de jours doit tre positif')
SELECT @YYYYMMDD = CONVERT(varchar(10),DATEADD(day, @NBJOURS,CAST('1900-01-01' AS DATETIME2)),120)
RETURN @YYYYMMDD
END
–===========================================================
– Description : Nombre de jours ouvrés entre deux dates
– Auteur : Etienne ZINZINDOHOUE
– Exemple d'utilisation : SELECT dbo.F_NBJOURS_OUVRABLE(‘20110201′,’20110228′)
–===========================================================
CREATE FUNCTION dbo.F_NBJOURS_OUVRABLE(@DateDebut DATETIME, @DateFin DATETIME)
RETURNS INT AS
BEGIN
DECLARE @NbJOURS INT ; –Nombre de jours
IF (@DateDebut IS NULL OR @DateFin IS NULL) RETURN (0)
SET @NbJOURS = 0 ;
WHILE (@DateDebut <= @DateFin)
BEGIN
IF (SELECT @@DATEFIRST)= 1 – Si le premier jour de la semaine est lundi
BEGIN
SET @NbJOURS = @NbJOURS + CASE
WHEN DATEPART(dw,@DateDebut) BETWEEN 1 AND 5 THEN 1
ELSE 0
END
SET @DateDebut = @DateDebut + 1
END
IF (SELECT @@DATEFIRST)= 7 – Si le premier jour de la semaine est dimanche
BEGIN
SET @NbJOURS = @NbJOURS + CASE
WHEN DATEPART(dw,@DateDebut) BETWEEN 2 AND 6 THEN 1
ELSE 0
END
SET @DateDebut = @DateDebut + 1
END
END
RETURN (@NbJOURS)
END
——————————————————————————
Etienne ZINZINDOHOUE
——————————————————————————