-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathGregorianToJalali.sql
170 lines (147 loc) · 6.92 KB
/
GregorianToJalali.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/***************************************************
Main script written by Seyed Mahdi Movashah which is taken from http://rastan.parsiblog.com/Posts/381
Optimized By Mir Asghar Mehdizadeh (Mamehdi) which is taken from http://mamehdi.parsiblog.com/Posts/1
Example: PRINT dbo.GregorianToJalali('2016-11-7', 'Saal/Maah2/Rooz2')
PRINT dbo.GregorianToJalali(GETDATE(), 'Rooz MaahHarfi Saal')
****************************************************/
CREATE FUNCTION [dbo].[GregorianToJalali]
(
@GregorianDate DATETIME ,
@OutputFormat AS NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
BEGIN
/* OutputFormat Rules: (پنجشنبه 7 اردیبهشت 1394)
ChandShanbe -> پنجشنبه (روز هفته به حروف)
ChandShanbeAdadi -> 6 (روز هفته به عدد)
Rooz -> 7 (چندمین روز از ماه)
Rooz2 -> 07 (چندمین روز از ماه دو کاراکتری)
Maah -> 2 (چندمین ماه از سال)
Maah2 -> 02 (چندمین ماه از سال دو کاراکتری)
MaahHarfi -> اردیبهشت (نام ماه به حروف)
Saal -> 1394 (سال چهار کاراکتری)
Saal2 -> 94 (سال دو کاراکتری)
Saal4 -> 1394 (سال چهار کاراکتری)
SaalRooz -> 38 (چندمین روز سال)
Default OutputFormat -> 'ChandShanbe Rooz MaahHarfi Saal'
*/
DECLARE @YY SMALLINT= YEAR(@GregorianDate) ,
@MM TINYINT= 10 ,
@DD SMALLINT= 11 ,
@DDCNT TINYINT ,
@YYDD SMALLINT= 0 ,
@SHMM NVARCHAR(8) ,
@SHDD NVARCHAR(8)
DECLARE @SHDATE NVARCHAR(MAX)
IF @YY < 1000
SET @YY += 2000
IF ( @OutputFormat IS NULL )
OR NOT LEN(@OutputFormat) > 0
SET @OutputFormat = 'ChandShanbe Rooz MaahHarfi Saal'
SET @YY -= 622
IF @YY % 4 = 3
AND @YY > 1371
SET @DD = 12
SET @DD += DATEPART(DY, @GregorianDate) - 1
WHILE 1 = 1
BEGIN
SET @DDCNT = CASE WHEN @MM < 7 THEN 31
WHEN @YY % 4 < 3
AND @MM = 12
AND @YY > 1370 THEN 29
WHEN @YY % 4 <> 2
AND @MM = 12
AND @YY < 1375 THEN 29
ELSE 30
END
IF @DD > @DDCNT
BEGIN
SET @DD -= @DDCNT
SET @MM += 1
SET @YYDD += @DDCNT
END
IF @MM > 12
BEGIN
SET @MM = 1
SET @YY += 1
SET @YYDD = 0
END
IF @MM < 7
AND @DD < 32
BREAK
IF @MM BETWEEN 7 AND 11
AND @DD < 31
BREAK
IF @MM = 12
AND @YY % 4 < 3
AND @YY > 1370
AND @DD < 30
BREAK
IF @MM = 12
AND @YY % 4 <> 2
AND @YY < 1375
AND @DD < 30
BREAK
IF @MM = 12
AND @YY % 4 = 2
AND @YY < 1371
AND @DD < 31
BREAK
IF @MM = 12
AND @YY % 4 = 3
AND @YY > 1371
AND @DD < 31
BREAK
END
SET @YYDD += @DD
SET @SHMM = CASE WHEN @MM = 1 THEN N'فروردین'
WHEN @MM = 2 THEN N'اردیبهشت'
WHEN @MM = 3 THEN N'خرداد'
WHEN @MM = 4 THEN N'تیر'
WHEN @MM = 5 THEN N'مرداد'
WHEN @MM = 6 THEN N'شهریور'
WHEN @MM = 7 THEN N'مهر'
WHEN @MM = 8 THEN N'آبان'
WHEN @MM = 9 THEN N'آذر'
WHEN @MM = 10 THEN N'دی'
WHEN @MM = 11 THEN N'بهمن'
WHEN @MM = 12 THEN N'اسفند'
END
SET @SHDD = CASE WHEN DATEPART(dw, @GregorianDate) = 7 THEN N'شنبه'
WHEN DATEPART(dw, @GregorianDate) = 1 THEN N'یکشنبه'
WHEN DATEPART(dw, @GregorianDate) = 2 THEN N'دوشنبه'
WHEN DATEPART(dw, @GregorianDate) = 3 THEN N'سهشنبه'
WHEN DATEPART(dw, @GregorianDate) = 4 THEN N'چهارشنبه'
WHEN DATEPART(dw, @GregorianDate) = 5 THEN N'پنجشنبه'
WHEN DATEPART(dw, @GregorianDate) = 6 THEN N'جمعه'
END
SET @DDCNT = CASE WHEN @SHDD = N'شنبه' THEN 1
WHEN @SHDD = N'یکشنبه' THEN 2
WHEN @SHDD = N'دوشنبه' THEN 3
WHEN @SHDD = N'سهشنبه' THEN 4
WHEN @SHDD = N'چهارشنبه' THEN 5
WHEN @SHDD = N'پنجشنبه' THEN 6
WHEN @SHDD = N'جمعه' THEN 7
END
SET @SHDATE = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@OutputFormat,
'MaahHarfi', @SHMM),
'SaalRooz', LTRIM(STR(@YYDD,3))),
'ChandShanbeAdadi',@DDCNT),
'ChandShanbe', @SHDD),
'Rooz2', REPLACE(STR(@DD,2), ' ', '0')),
'Maah2', REPLACE(STR(@MM,2), ' ', '0')),
'Saal2', SUBSTRING(STR(@YY,4), 3, 2)),
'Saal4', STR(@YY, 4)),
'Saal', LTRIM(STR(@YY, 4))),
'Maah', LTRIM(STR(@MM, 2))),
'Rooz', LTRIM(STR(@DD, 2)))
/* OutputFormat Samples:
OutputFormat='ChandShanbe Rooz MaahHarfi Saal' -> پنجشنبه 17 اردیبهشت 1394
OutputFormat='Rooz MaahHarfi Saal' -> ـ 17 اردیبهشت 1394
OutputFormat='Rooz/Maah/Saal' -> 1394/2/17
OutputFormat='Rooz2/Maah2/Saal2' -> 94/02/17
OutputFormat='Rooz روز گذشته از MaahHarfi در سال Saal2' -> ـ 17 روز گذشته از اردیبهشت در سال 94
*/
RETURN @SHDATE
END
GO