@@ -3,44 +3,45 @@ IS_NUM: CASE
33 ELSE 0
44 END
55
6- IS_DATE : CASE WHEN TRY_CAST(NULLIF({$1}, '') AS float) IS NOT NULL
7- AND LEFT(NULLIF({$1}, ''),4) BETWEEN 1800 AND 2200 THEN
8- CASE
9- WHEN LEN((NULLIF({$1}, ''))) > 11 THEN 0
10- /* YYYYMMDD */
11- WHEN TRY_CONVERT(DATE, NULLIF({$1}, ''), 112) IS NOT NULL THEN 1
12-
13- /* YYYY-MM-DD */
14- WHEN TRY_CONVERT(DATE, NULLIF({$1}, ''), 23) IS NOT NULL THEN 1
15-
16- /* MM/DD/YYYY */
17- WHEN TRY_CONVERT(DATE, NULLIF({$1}, ''), 101) IS NOT NULL THEN 1
18-
19- /* MM/DD/YY */
20- WHEN TRY_CONVERT(DATE, NULLIF({$1}, ''), 1) IS NOT NULL THEN 1
21-
22- /*MM-DD-YYYY */
23- WHEN TRY_CONVERT(DATE, NULLIF({$1}, ''), 110) IS NOT NULL THEN 1
24-
25- /*MM-DD-YY */
26- WHEN TRY_CONVERT(DATE, NULLIF({$1}, ''), 10) IS NOT NULL THEN 1
27-
28-
29- ELSE 0 END
30- /*DD MMM YYYY */
31- WHEN (TRY_CONVERT(DATE, NULLIF({$1}, ''), 106) IS NOT NULL
32- AND LEFT(NULLIF({$1}, ''), 4) BETWEEN 1800 AND 2200)
33- THEN 1
34-
35- /* YYYY-MM-DD HH:MM:SS SSSSSS */
36- WHEN (TRY_CONVERT(DATETIME2, NULLIF({$1}, ''), 121) IS NOT NULL
37- AND LEFT(NULLIF({$1}, ''), 4) BETWEEN 1800 AND 2200)
38- THEN 1
39-
40- /* YYYY-MM-DD HH:MM:SS */
41- WHEN (TRY_CONVERT(DATETIME2, NULLIF({$1}, ''), 120) IS NOT NULL
42- AND LEFT(NULLIF({$1}, ''), 4) BETWEEN 1800 AND 2200)
43- THEN 1
44- ELSE 0
45- END
46-
6+ IS_DATE : |-
7+ CASE
8+ WHEN NULLIF(LTRIM(RTRIM({$1})), '') IS NULL THEN 0
9+ WHEN (
10+ COALESCE(
11+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 112), /* YYYYMMDD */
12+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 23), /* YYYY-MM-DD */
13+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 101), /* MM/DD/YYYY */
14+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 1), /* MM/DD/YY (2-digit year windowing) */
15+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 110), /* MM-DD-YYYY */
16+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 10), /* MM-DD-YY (2-digit year windowing) */
17+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 106), /* DD MMM YYYY */
18+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 107), /* MMM dd, YYYY */
19+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 126), /* ISO 8601 no TZ: YYYY-MM-DDTHH:MM:SS[.fff] */
20+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 120), /* YYYY-MM-DD HH:MM:SS */
21+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 121), /* YYYY-MM-DD HH:MM:SS.mmm */
22+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 111), /* YYYY/MM/DD */
23+ TRY_CONVERT(datetime2, LTRIM(RTRIM({$1})), 102), /* YYYY.MM.DD */
24+ /* Normalize "YYYY-MM-DD HH:MM:SS SSSSSS" -> ISO 8601 with 'T' and '.' */
25+ TRY_CONVERT(
26+ datetime2,
27+ CASE
28+ WHEN LTRIM(RTRIM({$1})) LIKE
29+ '[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9] [0-9]%'
30+ THEN
31+ /* Replace DT space (pos 11) with 'T', and the last space with '.' */
32+ STUFF(
33+ STUFF(LTRIM(RTRIM({$1})), 11, 1, 'T'),
34+ LEN(LTRIM(RTRIM({$1}))) - CHARINDEX(' ', REVERSE(LTRIM(RTRIM({$1})))) + 1,
35+ 1,
36+ '.'
37+ )
38+ ELSE LTRIM(RTRIM({$1}))
39+ END,
40+ 126
41+ )) BETWEEN '1800-01-01T00:00:00' AND '2200-12-31T23:59:59.9999999' )
42+ OR ( /* ISO 8601 with timezone: style 127 parsed as datetimeoffset, then cast */
43+ CAST(TRY_CONVERT(datetimeoffset, LTRIM(RTRIM({$1})), 127) AS datetime2)
44+ BETWEEN '1800-01-01T00:00:00' AND '2200-12-31T23:59:59.9999999' )
45+ THEN 1
46+ ELSE 0
47+ END
0 commit comments