This scipt is inspired by FormatDate - Mimics the VB Format routine for date. But this script work actually only whith a english Server. I improved this by a language independant. I use 2 others functions to retrieve the Long and short month name.
This scipt is inspired by FormatDate - Mimics the VB Format routine for date. But this script work actually only whith a english Server. I improved this by a language independant. I use 2 others functions to retrieve the Long and short month name.
--------------------------------------------------------------------------------
-- Format: Jourdddd: nom complet du jour
--ddd: nom abrégé jour
--dd: numéro de jour sur 2 chiffres
--d: numéro de jour
-- Moismmmm: nom complet du mois
--mmm: nom abrégé du mois
--mm: numéro du mois sur 2 chiffres
--m: numéro du mois
-- Annéeyyyy: année sur 4 chiffres
--yy: année sur 2 chiffres
--------------------------------------------------------------------------------
-- Exemple: dddd, d mmmm yyyy--> Dimanche, 14 juillet 2003
-- ddmmyyyy --> 14072003
-- d-m-yy--> 14-7-03
-- dd/mm/yyyy--> 14/07/2003
--------------------------------------------------------------------------------
CREATE FUNCTION dbo.uf_FormatDate
(
@date datetime, -- Date à formater
@formatvarchar(50)-- Format de date
)
RETURNS VARCHAR(50)
AS
BEGIN
--------------------------------------------------------------------------------
-- Null ?
--------------------------------------------------------------------------------
IF @date IS NULL RETURN NULL
IF @format IS NULL RETURN NULL
--------------------------------------------------------------------------------
-- Variable
--------------------------------------------------------------------------------
DECLARE
@pos AS INTEGER,
@paternAS VARCHAR(4)
--------------------------------------------------------------------------------
-- Remplace les paramètres
--------------------------------------------------------------------------------
SET @format = REPLACE(@format, 'yyyy', REPLICATE(CHAR(9),4))
SET @format = REPLACE(@format, 'yy', REPLICATE(CHAR(9),2))
SET @format = REPLACE(@format, 'mmmm', REPLICATE(CHAR(10),4))
SET @format = REPLACE(@format, 'mmm', REPLICATE(CHAR(10),3))
SET @format = REPLACE(@format, 'mm', REPLICATE(CHAR(10), 2))
SET @format = REPLACE(@format, 'm', REPLICATE(CHAR(10),1))
SET @format = REPLACE(@format, 'dddd', REPLICATE(CHAR(11),4))
SET @format = REPLACE(@format, 'ddd', REPLICATE(CHAR(11),3))
SET @format = REPLACE(@format, 'dd', REPLICATE(CHAR(11), 2))
SET @format = REPLACE(@format, 'd', REPLICATE(CHAR(11),1))
--------------------------------------------------------------------------------
-- Remplace l'année
--------------------------------------------------------------------------------
SET @patern = REPLICATE(CHAR(9),4)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 4, DATENAME(yyyy, @date))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(9),2)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 2, RIGHT(DATENAME(yyyy, @date) ,2))
SET @pos = CHARINDEX(@patern, @format)
END
--------------------------------------------------------------------------------
-- Remplace le mois
--------------------------------------------------------------------------------
SET @patern = REPLICATE(CHAR(10),4)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 4, dbo.uf_MonthName(month(@date)))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(10),3)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 3, dbo.uf_ShortMonthName(month(@date)))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(10),2)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 2, RIGHT(('0' + CAST(DATEPART(month, @date) AS VARCHAR(2))), 2))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(10),1)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 1, CAST(DATEPART(month, @date) AS VARCHAR(2)))
SET @pos = CHARINDEX(@patern, @format)
END
--------------------------------------------------------------------------------
-- Replace le jour
--------------------------------------------------------------------------------
SET @patern = REPLICATE(CHAR(11),4)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 4, DATENAME(weekday, @date))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(11),3)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 3, LEFT(DATENAME(weekday, @date), 3))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(11),2)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 2, RIGHT(('0' + DATENAME(day, @date)), 2))
SET @pos = CHARINDEX(@patern, @format)
END
SET @patern = REPLICATE(CHAR(11),1)
SET @pos = CHARINDEX(@patern, @format)
WHILE @pos > 0
BEGIN
SET @format = STUFF(@format, @pos, 1, CAST(DATEPART(day, @date) AS VARCHAR(2)))
SET @pos = CHARINDEX(@patern, @format)
END
-- Vide ?
IF @format = '//'
BEGIN
SET @format = ''
END
-- Renvoie
RETURN @format
END
--------------------------------------------------------------------------------
CREATE FUNCTION dbo.uf_MonthName
(
@month int
)
RETURNS VARCHAR(15)
AS
BEGIN
-- Variable
DECLARE
@MonthNamesvarchar(2000),
@IndexMonthint,
@posint
-- Récupère
SELECT @MonthNames = months
FROMmaster.dbo.syslanguages
WHERE name = @@language
-- Initialise
SET @IndexMonth = 1
--Boucle
WHILE @IndexMonth < @month
BEGIN
SET @pos = CHARINDEX(',', @MonthNames)
SET @MonthNames = SUBSTRING(@MonthNames, @pos + 1, 1000)
SET @IndexMonth = @IndexMonth + 1
END
-- Dernier ?
IF CHARINDEX(',', @MonthNames)> 0
SET @MonthNames = LEFT(@MonthNames, CHARINDEX(',', @MonthNames) - 1)
-- Renvoie
RETURN @MonthNames
END
--------------------------------------------------------------------------------
CREATE FUNCTION dbo.uf_ShortMonthName
(
@month int
)
RETURNS VARCHAR(15)
AS
BEGIN
-- Variable
DECLARE
@MonthNamesvarchar(2000),
@IndexMonthint,
@posint
-- Récupère
SELECT @MonthNames = shortmonths
FROMmaster.dbo.syslanguages
WHERE name = @@language
-- Initialise
SET @IndexMonth = 1
--Boucle
WHILE @IndexMonth < @month
BEGIN
SET @pos = CHARINDEX(',', @MonthNames)
SET @MonthNames = SUBSTRING(@MonthNames, @pos + 1, 1000)
SET @IndexMonth = @IndexMonth + 1
END
-- Dernier
IF CHARINDEX(',', @MonthNames)> 0
SET @MonthNames = LEFT(@MonthNames, CHARINDEX(',', @MonthNames) - 1)
-- Renvoie
RETURN @MonthNames
END