1+ IF EXISTS (SELECT * FROM sys .objects WHERE schema_id = SCHEMA_ID (' microsoft' ) AND name = N ' date_trunc' )
2+ DROP FUNCTION microsoft .date_trunc ;
3+ GO
4+
5+ /*
6+ Note: The DATEDIFF function returns a 4-byte integer (int). Until Azure Synapse SQL supports DATEDIFF_BIG
7+ with an 8-byte integer return type, date_trunc can and likely will throw an overflow exception when
8+ truncating small date_part units like second or smaller.
9+ */
10+
11+ CREATE FUNCTION microsoft .date_trunc (@unit VARCHAR (15 ), @expression VARCHAR (8000 ))
12+ RETURNS DATETIME2
13+ WITH SCHEMABINDING
14+ AS
15+ BEGIN
16+
17+ -- Declarations
18+ DECLARE @result DATETIME2 ;
19+
20+ SET @unit = UPPER (@unit);
21+
22+ SET
23+ @result =
24+ (
25+ CASE
26+ -- Year
27+ WHEN @unit = ' Y' OR @unit = ' YEAR' THEN DATEADD (YEAR , DATEDIFF (YEAR , 0 , @expression), 0 )
28+
29+ -- Month
30+ WHEN @unit = ' M' OR @unit = ' MONTH' THEN DATEADD (MONTH , DATEDIFF (MONTH , 0 , @expression), 0 )
31+
32+ -- Day
33+ WHEN @unit = ' D' OR @unit = ' DAY' THEN DATEADD (DAY , DATEDIFF (DAY , 0 , @expression), 0 )
34+
35+ -- Hour
36+ WHEN @unit = ' H' OR @unit = ' HOUR' THEN DATEADD (HOUR, DATEDIFF (HOUR, 0 , @expression), 0 )
37+
38+ -- Minute
39+ WHEN @unit = ' MINUTE' THEN DATEADD (MINUTE, DATEDIFF (MINUTE, 0 , @expression), 0 )
40+
41+ -- Second
42+ WHEN @unit = ' S' OR @unit = ' SECOND' THEN DATEADD (SECOND, DATEDIFF (SECOND, 0 , @expression), 0 )
43+
44+ -- Millisecond
45+ WHEN @unit = ' MS' OR @unit = ' MILLISECOND' THEN DATEADD (MILLISECOND , DATEDIFF (MILLISECOND , 0 , @expression), 0 )
46+
47+ -- Microsecond
48+ WHEN @unit = ' MICROSECOND' THEN DATEADD (MICROSECOND , DATEDIFF (MICROSECOND , 0 , @expression), 0 )
49+
50+ -- Nanosecond
51+ WHEN @unit = ' NANOSECOND' THEN DATEADD (NANOSECOND , DATEDIFF (NANOSECOND , 0 , @expression), 0 )
52+
53+ -- Week
54+ WHEN @unit = ' W' OR @unit = ' WEEK' THEN DATEADD (DAY , - (DATEPART (WEEKDAY , @expression) - 1 ), @expression)
55+
56+ -- Quarter
57+ WHEN @unit = ' QUARTER' THEN microsoft .FirstDayOfQuarter (@expression)
58+ END
59+ );
60+
61+ RETURN @result;
62+
63+ END
64+ GO
0 commit comments