1+ IF EXISTS (SELECT * FROM sys .objects WHERE schema_id = SCHEMA_ID (' microsoft' ) AND name = N ' to_char' )
2+ DROP FUNCTION microsoft .to_char ;
3+ GO
4+
5+ CREATE FUNCTION microsoft .to_char (@date datetime2 , @format VARCHAR (32 ) = ' ' )
6+ RETURNS VARCHAR (128 )
7+ WITH SCHEMABINDING
8+ AS
9+ BEGIN
10+
11+ -- Fast opt out
12+ IF (@date IS NULL OR TRIM (@format) = ' ' )
13+ RETURN @date;
14+
15+ DECLARE @format_internal VARCHAR (48 ) = @format;
16+ DECLARE @date_internal VARCHAR (256 );
17+
18+ -- Special case for Day of Year (DDD or D3)
19+ IF ( (CHARINDEX (' DDD' , @format_internal COLLATE Latin1_General_CS_AS) > 0 ) OR (CHARINDEX (' D3' , @format_internal COLLATE Latin1_General_CS_AS) > 0 ) )
20+ BEGIN
21+ -- Ideally will support THROW here in a future Azure Synapse SQL release.
22+ RETURN ' The format '' DDD'' (Day of Year) is not supported in T-SQL. Please try using the DATEPART(DAYOYYEAR, expression) syntax.'
23+ END
24+
25+ -- Special cases for hour separator
26+ SET @format_internal = REPLACE (@format_internal COLLATE Latin1_General_CS_AS, ' h' , ' \h' );
27+
28+ -- Special case for minute separator
29+ SET @format_internal = REPLACE (@format_internal COLLATE Latin1_General_CS_AS, ' m' , ' \m' );
30+
31+ -- Special case for second separator
32+ SET @format_internal = REPLACE (@format_internal COLLATE Latin1_General_CS_AS, ' s' , ' \s' );
33+
34+ -- Replacements for year
35+ SET @format_internal = REPLACE (@format_internal, ' YYYY' , ' yyyy' );
36+ SET @format_internal = REPLACE (@format_internal, ' Y4' , ' yyyy' );
37+ SET @format_internal = REPLACE (@format_internal, ' YY' , ' yy' );
38+
39+ -- Replacements for month
40+ SET @format_internal = REPLACE (@format_internal, ' M4' , ' MMMM' );
41+ SET @format_internal = REPLACE (@format_internal, ' M3' , ' MMM' );
42+
43+ -- Replacements for day
44+ SET @format_internal = REPLACE (@format_internal, ' DD' , ' dd' );
45+ SET @format_internal = REPLACE (@format_internal, ' D' , ' d ' );
46+
47+ -- Replacements for hour
48+
49+ -- Replacements for minute
50+ SET @format_internal = REPLACE (@format_internal, ' MI' , ' mm' );
51+
52+ -- Replacements for 12/24 hour clock
53+ SET @format_internal = REPLACE (@format_internal, ' T' , ' tt' );
54+
55+ -- Replacements for seconds
56+ SET @format_internal = REPLACE (@format_internal, ' SS' , ' ss' );
57+
58+ -- Replacements for day of the week
59+ SET @format_internal = REPLACE (@format_internal, ' EEEE' , ' dddd' );
60+ SET @format_internal = REPLACE (@format_internal, ' E4' , ' dddd' );
61+
62+ SET @format_internal = REPLACE (@format_internal, ' EEE' , ' ddd' );
63+ SET @format_internal = REPLACE (@format_internal, ' E3' , ' ddd' );
64+
65+ -- Replacements for separator B | b
66+ SET @format_internal = REPLACE (@format_internal, ' B' , ' ' );
67+ SET @format_internal = REPLACE (@format_internal, ' b' , ' ' );
68+
69+ SET @date_internal = FORMAT (@date, @format_internal);
70+
71+ RETURN @date_internal;
72+
73+ END
74+ GO
0 commit comments