SHOW:
|
|
- or go back to the newest paste.
1 | declare @i varchar(999) = '3 1 1 1970 20 7 1988 12 12 2012'; | |
2 | ||
3 | ;with parseinput as | |
4 | ( | |
5 | select n = cast(substring(@i,1,charindex(' ',@i)-1) as int)*3, | |
6 | i = cast(substring(@i,charindex(' ',@i)+1,999)+' ' as varchar(100)), | |
7 | x = 0, | |
8 | t = 'x' | |
9 | union all | |
10 | select n = n-1, | |
11 | i = cast(substring(i,charindex(' ',i)+1,999) as varchar(100)), | |
12 | x = cast(substring(i,1,charindex(' ',i)-1) as int), | |
13 | t = case n%3 when 0 then 'd' when 2 then 'm' else 'y' end | |
14 | from parseinput | |
15 | where n > 0 | |
16 | ) | |
17 | ,pivotdates as | |
18 | ( | |
19 | select n = n/3, | |
20 | d = max(case when t = 'd' then x else 0 end), | |
21 | m = max(case when t = 'm' then x else 0 end), | |
22 | y = max(case when t = 'y' then x else 0 end) | |
23 | from parseinput | |
24 | where t <> 'x' | |
25 | group by n/3 | |
26 | ) | |
27 | - | ,convertdates as |
27 | + | |
28 | ( | |
29 | - | select n, d, m, y |
29 | + | |
30 | union all | |
31 | select yr+case when (yr+4) % 100 = 0 and (yr+4) % 400 <> 0 then 8 else 4 end | |
32 | from leapyears | |
33 | where yr < 100000 | |
34 | ) | |
35 | ,datediffs as | |
36 | ( | |
37 | select n, | |
38 | midx = 1856304 | |
39 | + (y-1970)*365 | |
40 | + case m when 1 then 0 when 5 then 120 when 9 then 243 | |
41 | when 2 then 31 when 6 then 151 when 10 then 273 | |
42 | when 3 then 59 when 7 then 181 when 11 then 304 | |
43 | when 4 then 90 when 8 then 212 when 12 then 334 | |
44 | end | |
45 | + (d) | |
46 | + ( select count(*) from leapyears where yr<y or (yr=y and m>2) ) | |
47 | from pivotdates | |
48 | ) | |
49 | ,convertmayan as | |
50 | ( | |
51 | select n, | |
52 | baktun = cast(midx/20/20/18/20 as varchar(9)), | |
53 | katun = cast(midx/20/18/20 % 20 as varchar(9)), | |
54 | tun = cast(midx/20/18 % 20 as varchar(9)), | |
55 | winal = cast(midx/20 % 18 as varchar(9)), | |
56 | kin = cast(midx % 20 as varchar(9)) | |
57 | from datediffs | |
58 | ) | |
59 | select baktun+'.'+katun+'.'+tun+'.'+winal+'.'+kin | |
60 | from convertmayan | |
61 | order by n desc | |
62 | option (maxrecursion 32000) |