├── .github
└── FUNDING.yml
├── README.md
├── pdate-v1.sql
└── pdate-v2.sql
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | custom: ['https://payping.ir/@zoghal']
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [MySQL] pDate
2 |
3 |
4 | Content:
5 | * [About](#about)
6 | * [Requirements](#requirements)
7 | * [Download](#download)
8 | * [Installation](#installation)
9 | * [Usage](#usage)
10 | * [License](#license)
11 | * [Issues/Feedbacks](#issuesfeedbacks)
12 |
13 |
14 | ## About
15 |
16 | [MySQL] pDate is a Gregorian / Jalali date converter functions for MySQL.
17 |
18 | ## Requirements
19 |
20 | * MySQL 5+
21 |
22 | ## Download
23 |
24 | * zip: https://github.com/zoghal/Presian-Date-for-MySQL/zipball/master
25 | * tgz: https://github.com/zoghal/Presian-Date-for-MySQL/tarball/master
26 | * git http: `git clone http: https://github.com/zoghal/Presian-Date-for-MySQL.git`
27 | * git: `git clone git://github.com/zoghal/Presian-Date-for-MySQL.git`
28 |
29 | ## Installation
30 |
31 | Import __pDate.sql__ in your database.
32 |
33 | ## Usage
34 |
35 | You can use these six functions, which are provided on a set:
36 |
37 | #### PDATE(datetime)
38 | Takes georgian datetime as input and returns jalali date in text format.
39 |
40 | #### PMONTH(datetime)
41 | Takes georgian datetime as input and returns jalali month number in text format.
42 |
43 | #### PMONTHNAME(datetime)
44 | Takes georgian datetime as input and returns jalali month name in text format.
45 |
46 | #### PYEAR(datetime)
47 | Takes georgian datetime as input and returns jalali year number in text format.
48 |
49 | #### PDAY(datetime)
50 | Takes georgian datetime as input and returns jalali day number in text format.
51 |
52 | #### GDATE(year smallint, month smallint, day smallint)
53 | Takes jalali date in "year/month/day" format as input and returns georgian date in datetime format.
54 |
55 | #### GDATESTR(jdate char(10))
56 | Takes jalali date in string format (e.g: `'1390/3/3'` or `'1390/03/3'` or `'1390/3/03` or `'1390/03/03' `) as input and returns georgian date in datetime format.
57 |
58 | _You can not enter Jalali year in short format! for example `'90/03/03'` shows the 90th Jalali year, not 1390!_
59 |
60 | ---
61 |
62 | Here is simple line of sql code which you can use it to test the set of functions:
63 |
64 | ```
65 | SELECT pdate(NOW()),
66 | pyear('2009-09-22'),
67 | pmonth('2009-09-22'),
68 | pmonthname(NOW()),
69 | gdate(1366,9,19),
70 | gdatestr('1366/9/19');
71 | ```
72 |
73 |
74 | ## License
75 |
76 | GNU General Public License. [http://www.gnu.org/licenses/gpl.txt](http://www.gnu.org/licenses/gpl.txt)
77 |
78 | ## Issues/Feedbacks
79 |
80 | https://github.com/zoghal/Presian-Date-for-MySQL/issues
81 |
--------------------------------------------------------------------------------
/pdate-v1.sql:
--------------------------------------------------------------------------------
1 | -- Gregorian - Jalali Date Converter Functions for Mysql, v2.0.0
2 | -- Copyright (C) 2019 Mohammad Saleh Souzanchi(saleh.souzanchi@gmail.com|https://github.com/zoghal), Mehran . M . Spitman
3 | --
4 | -- This program is free software: you can redistribute it and/or modify
5 | -- it under the terms of the GNU General Public License as published by
6 | -- the Free Software Foundation, either version 3 of the License, or
7 | -- (at your option) any later version.
8 | --
9 | -- This program is distributed in the hope that it will be useful,
10 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | -- GNU General Public License for more details.
13 | --
14 | -- You should have received a copy of the GNU General Public License
15 | -- along with this program. If not, see .
16 |
17 |
18 |
19 |
20 | -- ----------------------------
21 | -- Function structure for `__mydiv`
22 | -- ----------------------------
23 | DROP FUNCTION IF EXISTS `__mydiv`;
24 | DELIMITER ;;
25 | CREATE DEFINER=`root`@`localhost` FUNCTION `__mydiv`(`a` int, `b` int) RETURNS bigint(20)
26 | BEGIN
27 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
28 | # WebLog : http://soozanchi.ir
29 | # Version V1.0.2
30 |
31 | return FLOOR(a / b);
32 | END;;
33 | DELIMITER ;
34 |
35 | -- ----------------------------
36 | -- Function structure for `__mymod`
37 | -- ----------------------------
38 | DROP FUNCTION IF EXISTS `__mymod`;
39 | DELIMITER ;;
40 | CREATE DEFINER=`root`@`localhost` FUNCTION `__mymod`(`a` int, `b` int) RETURNS bigint(20)
41 | BEGIN
42 | # Copyright (C) 2011-2012 Mehran . M . Spitman
43 | # WebLog :spitman.azdaa.com
44 | # Version V1.0.2
45 |
46 | return (a - b * FLOOR(a / b));
47 | END;;
48 | DELIMITER ;
49 |
50 | -- ----------------------------
51 | -- Function structure for `_gdmarray`
52 | -- ----------------------------
53 | DROP FUNCTION IF EXISTS `_gdmarray`;
54 | DELIMITER ;;
55 | CREATE DEFINER=`root`@`localhost` FUNCTION `_gdmarray`(`m` smallint) RETURNS smallint(2)
56 | BEGIN
57 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
58 | # WebLog : http://soozanchi.ir
59 | # Version V1.0.1
60 |
61 | CASE m
62 | WHEN 0 THEN RETURN 31;
63 | WHEN 1 THEN RETURN 28;
64 | WHEN 2 THEN RETURN 31;
65 | WHEN 3 THEN RETURN 30;
66 | WHEN 4 THEN RETURN 31;
67 | WHEN 5 THEN RETURN 30;
68 | WHEN 6 THEN RETURN 31;
69 | WHEN 7 THEN RETURN 31;
70 | WHEN 8 THEN RETURN 30;
71 | WHEN 9 THEN RETURN 31;
72 | WHEN 10 THEN RETURN 30;
73 | WHEN 11 THEN RETURN 31;
74 | END CASE;
75 |
76 | END;;
77 | DELIMITER ;
78 |
79 | -- ----------------------------
80 | -- Function structure for `_jdmarray`
81 | -- ----------------------------
82 | DROP FUNCTION IF EXISTS `_jdmarray`;
83 | DELIMITER ;;
84 | CREATE DEFINER=`root`@`localhost` FUNCTION `_jdmarray`(`m` smallint) RETURNS smallint(2)
85 | BEGIN
86 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
87 | # WebLog : http://soozanchi.ir
88 | # Version V1.0.1
89 |
90 | CASE m
91 | WHEN 0 THEN RETURN 31;
92 | WHEN 1 THEN RETURN 31;
93 | WHEN 2 THEN RETURN 31;
94 | WHEN 3 THEN RETURN 31;
95 | WHEN 4 THEN RETURN 31;
96 | WHEN 5 THEN RETURN 31;
97 | WHEN 6 THEN RETURN 30;
98 | WHEN 7 THEN RETURN 30;
99 | WHEN 8 THEN RETURN 30;
100 | WHEN 9 THEN RETURN 30;
101 | WHEN 10 THEN RETURN 30;
102 | WHEN 11 THEN RETURN 29;
103 | END CASE;
104 |
105 | END;;
106 | DELIMITER ;
107 |
108 | -- ----------------------------
109 | -- Function structure for `_jdmarray2`
110 | -- ----------------------------
111 | DROP FUNCTION IF EXISTS `_jdmarray2`;
112 | DELIMITER ;;
113 | CREATE DEFINER=`root`@`localhost` FUNCTION `_jdmarray2`(`m` smallint) RETURNS smallint(2)
114 | BEGIN
115 | # Copyright (C) 2011-2012 Mehran . M . Spitman
116 | # WebLog :spitman.azdaa.com
117 | # Version V1.0.1
118 |
119 | CASE m
120 | WHEN 1 THEN RETURN 31;
121 | WHEN 2 THEN RETURN 31;
122 | WHEN 3 THEN RETURN 31;
123 | WHEN 4 THEN RETURN 31;
124 | WHEN 5 THEN RETURN 31;
125 | WHEN 6 THEN RETURN 31;
126 | WHEN 7 THEN RETURN 30;
127 | WHEN 8 THEN RETURN 30;
128 | WHEN 9 THEN RETURN 30;
129 | WHEN 10 THEN RETURN 30;
130 | WHEN 11 THEN RETURN 30;
131 | WHEN 12 THEN RETURN 29;
132 | END CASE;
133 |
134 | END;;
135 | DELIMITER ;
136 |
137 | -- ----------------------------
138 | -- Function structure for `pdate`
139 | -- ----------------------------
140 | DROP FUNCTION IF EXISTS `pdate`;
141 | DELIMITER ;;
142 | CREATE DEFINER=`root`@`localhost` FUNCTION `pdate`(`gdate` datetime) RETURNS char(100) CHARSET utf8
143 | BEGIN
144 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
145 | # WebLog : http://soozanchi.ir
146 | # Version V1.0.2
147 |
148 | DECLARE
149 | i,
150 | gy, gm, gd,
151 | g_day_no, j_day_no, j_np,
152 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
153 | DECLARE resout char(100);
154 | DECLARE ttime CHAR(20);
155 |
156 | SET gy = YEAR(gdate) - 1600;
157 | SET gm = MONTH(gdate) - 1;
158 | SET gd = DAY(gdate) - 1;
159 | SET ttime = TIME(gdate);
160 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv (gy + 399, 400));
161 | SET i = 0;
162 |
163 | WHILE (i < gm) do
164 | SET g_day_no = g_day_no + _gdmarray(i);
165 | SET i = i + 1;
166 | END WHILE;
167 |
168 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
169 | SET g_day_no = g_day_no + 1;
170 | END IF;
171 |
172 | SET g_day_no = g_day_no + gd;
173 | SET j_day_no = g_day_no - 79;
174 | SET j_np = j_day_no DIV 12053;
175 | SET j_day_no = j_day_no % 12053;
176 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
177 | SET j_day_no = j_day_no % 1461;
178 |
179 | IF j_day_no >= 366 then
180 | SET jy = jy + __mydiv(j_day_no - 1, 365);
181 | SET j_day_no = (j_day_no - 1) % 365;
182 | END IF;
183 |
184 | SET i = 0;
185 |
186 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
187 | SET j_day_no = j_day_no - _jdmarray(i);
188 | SET i = i + 1;
189 | END WHILE;
190 |
191 | SET jm = i + 1;
192 | SET jd = j_day_no + 1;
193 | SET resout = CONCAT_WS ('-', jy, jm, jd);
194 |
195 | IF (ttime <> '00:00:00') then
196 | SET resout = CONCAT_WS(' ', resout, ttime);
197 | END IF;
198 |
199 | RETURN resout;
200 | END;;
201 | DELIMITER ;
202 |
203 | -- ----------------------------
204 | -- Function structure for `PMONTH`
205 | -- ----------------------------
206 | DROP FUNCTION IF EXISTS `PMONTH`;
207 | DELIMITER ;;
208 | CREATE DEFINER=`root`@`localhost` FUNCTION `PMONTH`(`gdate` datetime) RETURNS char(100) CHARSET utf8
209 | BEGIN
210 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
211 | # WebLog : http://soozanchi.ir
212 | # Version V1.0.2
213 |
214 | DECLARE
215 | i,
216 | gy, gm, gd,
217 | g_day_no, j_day_no, j_np,
218 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
219 | DECLARE resout char(100);
220 | DECLARE ttime CHAR(20);
221 |
222 | SET gy = YEAR(gdate) - 1600;
223 | SET gm = MONTH(gdate) - 1;
224 | SET gd = DAY(gdate) - 1;
225 | SET ttime = TIME(gdate);
226 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
227 | SET i = 0;
228 |
229 | WHILE (i < gm) do
230 | SET g_day_no = g_day_no + _gdmarray(i);
231 | SET i = i + 1;
232 | END WHILE;
233 |
234 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
235 | SET g_day_no = g_day_no + 1;
236 | END IF;
237 |
238 | SET g_day_no = g_day_no + gd;
239 | SET j_day_no = g_day_no - 79;
240 | SET j_np = j_day_no DIV 12053;
241 | set j_day_no = j_day_no % 12053;
242 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
243 | SET j_day_no = j_day_no % 1461;
244 |
245 | IF j_day_no >= 366 then
246 | SET jy = jy + __mydiv(j_day_no - 1, 365);
247 | SET j_day_no =(j_day_no - 1) % 365;
248 | END IF;
249 |
250 | SET i = 0;
251 |
252 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
253 | SET j_day_no = j_day_no - _jdmarray(i);
254 | SET i = i + 1;
255 | END WHILE;
256 |
257 | SET jm = i + 1;
258 | SET jd = j_day_no + 1;
259 | RETURN jm;
260 | END;;
261 | DELIMITER ;
262 |
263 | -- ----------------------------
264 | -- Function structure for `pmonthname`
265 | -- ----------------------------
266 | DROP FUNCTION IF EXISTS `pmonthname`;
267 | DELIMITER ;;
268 | CREATE DEFINER=`root`@`localhost` FUNCTION `pmonthname`(`gdate` datetime) RETURNS varchar(100) CHARSET utf8
269 | BEGIN
270 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
271 | # WebLog : http://soozanchi.ir
272 | # Version V1.0.1
273 |
274 | CASE PMONTH(gdate)
275 | WHEN 1 THEN RETURN 'فروردین';
276 | WHEN 2 THEN RETURN 'اردیبهشت';
277 | WHEN 3 THEN RETURN 'خرداد';
278 | WHEN 4 THEN RETURN 'تیر';
279 | WHEN 5 THEN RETURN 'مرداد';
280 | WHEN 6 THEN RETURN 'شهریور';
281 | WHEN 7 THEN RETURN 'مهر';
282 | WHEN 8 THEN RETURN 'آبان';
283 | WHEN 9 THEN RETURN 'آذر';
284 | WHEN 10 THEN RETURN 'دی';
285 | WHEN 11 THEN RETURN 'بهمن';
286 | WHEN 12 THEN RETURN 'اسفند';
287 | END CASE;
288 |
289 | END;;
290 | DELIMITER ;
291 |
292 | -- ----------------------------
293 | -- Function structure for `pyear`
294 | -- ----------------------------
295 | DROP FUNCTION IF EXISTS `pyear`;
296 | DELIMITER ;;
297 | CREATE DEFINER=`root`@`localhost` FUNCTION `pyear`(`gdate` datetime) RETURNS char(100) CHARSET utf8
298 | BEGIN
299 | # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
300 | # WebLog : http://soozanchi.ir
301 | # Version V1.0.1
302 |
303 | DECLARE
304 | i,
305 | gy, gm, gd,
306 | g_day_no, j_day_no, j_np,
307 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
308 | DECLARE resout char(100);
309 | DECLARE ttime CHAR(20);
310 |
311 | SET gy = YEAR(gdate) - 1600;
312 | SET gm = MONTH(gdate) - 1;
313 | SET gd = DAY(gdate) - 1;
314 | SET ttime = TIME(gdate);
315 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
316 | SET i = 0;
317 |
318 | WHILE (i < gm) do
319 | SET g_day_no = g_day_no + _gdmarray(i);
320 | SET i = i + 1;
321 | END WHILE;
322 |
323 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
324 | SET g_day_no = g_day_no + 1;
325 | END IF;
326 |
327 | SET g_day_no = g_day_no + gd;
328 | SET j_day_no = g_day_no - 79;
329 | SET j_np = j_day_no DIV 12053;
330 | set j_day_no = j_day_no % 12053;
331 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
332 | SET j_day_no = j_day_no % 1461;
333 |
334 | IF j_day_no >= 366 then
335 | SET jy = jy + __mydiv(j_day_no - 1, 365);
336 | SET j_day_no = (j_day_no - 1) % 365;
337 | END IF;
338 |
339 | SET i = 0;
340 |
341 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
342 | SET j_day_no = j_day_no - _jdmarray(i);
343 | SET i = i + 1;
344 | END WHILE;
345 |
346 | SET jm = i + 1;
347 | SET jd = j_day_no + 1;
348 | RETURN jy;
349 | END;;
350 | DELIMITER ;
351 |
352 | -- ----------------------------
353 | -- Function structure for `pday`
354 | -- ----------------------------
355 | DROP FUNCTION IF EXISTS `pday`;
356 | DELIMITER ;;
357 | CREATE DEFINER=`root`@`localhost` FUNCTION `pday`(`gdate` datetime) RETURNS char(100) CHARSET utf8
358 | BEGIN
359 | # Copyright (C) 2011-2012 Mohammad Saleh Souzanchi, Mehran . M . Spitman
360 | # WebLog : http://soozanchi.ir, spitman.azdaa.com
361 | # Version V1.0.1
362 |
363 | DECLARE
364 | i,
365 | gy, gm, gd,
366 | g_day_no, j_day_no, j_np,
367 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
368 | DECLARE resout char(100);
369 | DECLARE ttime CHAR(20);
370 |
371 | SET gy = YEAR(gdate) - 1600;
372 | SET gm = MONTH(gdate) - 1;
373 | SET gd = DAY(gdate) - 1;
374 | SET ttime = TIME(gdate);
375 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99 , 100) + __mydiv(gy + 399, 400));
376 | SET i = 0;
377 |
378 | WHILE (i < gm) do
379 | SET g_day_no = g_day_no + _gdmarray(i);
380 | SET i = i + 1;
381 | END WHILE;
382 |
383 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
384 | SET g_day_no = g_day_no + 1;
385 | END IF;
386 |
387 | SET g_day_no = g_day_no + gd;
388 | SET j_day_no = g_day_no - 79;
389 | SET j_np = j_day_no DIV 12053;
390 | SET j_day_no = j_day_no % 12053;
391 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
392 | SET j_day_no = j_day_no % 1461;
393 |
394 | IF j_day_no >= 366 then
395 | SET jy = jy + __mydiv(j_day_no - 1, 365);
396 | SET j_day_no = (j_day_no-1) % 365;
397 | END IF;
398 |
399 | SET i = 0;
400 |
401 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
402 | SET j_day_no = j_day_no - _jdmarray(i);
403 | SET i = i + 1;
404 | END WHILE;
405 |
406 | SET jm = i + 1;
407 | SET jd = j_day_no + 1;
408 | RETURN jd;
409 | END;;
410 | DELIMITER ;
411 |
412 |
413 | -- ----------------------------
414 | -- Function structure for `_gdmarray2`
415 | -- ----------------------------
416 | DROP FUNCTION IF EXISTS `_gdmarray2`;
417 | DELIMITER ;;
418 | CREATE DEFINER=`root`@`localhost` FUNCTION `_gdmarray2`(`m` smallint, `k` SMALLINT) RETURNS smallint(2)
419 | BEGIN
420 | # Copyright (C) 2011-2012 Mehran . M . Spitman
421 | # WebLog :spitman.azdaa.com
422 | # Version V1.0
423 |
424 | CASE m
425 | WHEN 0 THEN RETURN 31;
426 | WHEN 1 THEN RETURN 28+k;
427 | WHEN 2 THEN RETURN 31;
428 | WHEN 3 THEN RETURN 30;
429 | WHEN 4 THEN RETURN 31;
430 | WHEN 5 THEN RETURN 30;
431 | WHEN 6 THEN RETURN 31;
432 | WHEN 7 THEN RETURN 31;
433 | WHEN 8 THEN RETURN 30;
434 | WHEN 9 THEN RETURN 31;
435 | WHEN 10 THEN RETURN 30;
436 | WHEN 11 THEN RETURN 31;
437 | END CASE;
438 |
439 |
440 | END;;
441 | DELIMITER ;
442 |
443 | -- ----------------------------
444 | -- Function structure for `gdate`
445 | -- ----------------------------
446 | DROP FUNCTION IF EXISTS `gdate`;
447 | DELIMITER ;;
448 | CREATE DEFINER=`root`@`localhost` FUNCTION `gdate`(`jy` smallint, `jm` smallint, `jd` smallint) RETURNS datetime
449 | BEGIN
450 | # Copyright (C) 2011-2012 Mehran . M . Spitman
451 | # WebLog :spitman.azdaa.com
452 | # Version V1.0.1
453 |
454 | DECLARE
455 | i, j, e, k, mo,
456 | gy, gm, gd,
457 | g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, bkab1, j1
458 | INT DEFAULT 0; /* Can be unsigned int? */
459 | DECLARE resout char(100);
460 | DECLARE fdate datetime;
461 |
462 |
463 | SET bkab = __mymod(jy,33);
464 |
465 | IF (bkab = 1 or bkab= 5 or bkab = 9 or bkab = 13 or bkab = 17 or bkab = 22 or bkab = 26 or bkab = 30) THEN
466 | SET j=1;
467 | end IF;
468 |
469 | SET bkab1 = __mymod(jy+1,33);
470 |
471 | IF (bkab1 = 1 or bkab1= 5 or bkab1 = 9 or bkab1 = 13 or bkab1 = 17 or bkab1 = 22 or bkab1 = 26 or bkab1 = 30) THEN
472 | SET j1=1;
473 | end IF;
474 |
475 | CASE jm
476 | WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
477 | WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
478 | WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
479 | WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
480 | WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
481 | WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
482 | WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
483 | WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
484 | WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
485 | WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
486 | WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
487 | WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
488 | END CASE;
489 | IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
490 | IF jy <= 0 THEN SET e=1; end IF;
491 |
492 | IF e>0 THEN
493 | RETURN 0;
494 | end IF;
495 |
496 | IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
497 | SET i=1;
498 | end IF;
499 | SET gy = jy + 621 + i;
500 |
501 | IF (__mymod(gy,4)=0) THEN
502 | SET k=1;
503 | end IF;
504 |
505 | IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
506 | SET k=0;
507 | END IF;
508 |
509 | SET jmm=jm-1;
510 |
511 | WHILE (jmm > 0) do
512 | SET mday=mday+_jdmarray2(jmm);
513 | SET jmm=jmm-1;
514 | end WHILE;
515 |
516 | SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
517 | SET g_day_no=j_day_no+226899;
518 |
519 |
520 | SET g_day_no=g_day_no-(__mydiv(gy-1,4));
521 | SET g_day_mo=__mymod(g_day_no,365);
522 |
523 | IF (k=1 and j=1) THEN
524 | IF (g_day_mo=0) THEN
525 | RETURN CONCAT_WS('-',gy,'12','30');
526 | END IF;
527 | IF (g_day_mo=1) THEN
528 | RETURN CONCAT_WS('-',gy,'12','31');
529 | END IF;
530 | END IF;
531 |
532 | IF (g_day_mo=0) THEN
533 | RETURN CONCAT_WS('-',gy,'12','31');
534 | END IF;
535 |
536 |
537 | SET mo=0;
538 | SET gm=gm+1;
539 | while g_day_mo>_gdmarray2(mo,k) do
540 | SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
541 | SET mo=mo+1;
542 | SET gm=gm+1;
543 | end WHILE;
544 | SET gd=g_day_mo;
545 |
546 | RETURN CONCAT_WS('-',gy,gm,gd);
547 | END;;
548 | DELIMITER ;
549 |
550 | -- ----------------------------
551 | -- Function structure for `gdatestr`
552 | -- ----------------------------
553 | DROP FUNCTION IF EXISTS `gdatestr`;
554 | DELIMITER ;;
555 | CREATE DEFINER=`root`@`localhost` FUNCTION `gdatestr`(`jdat` char(10)) RETURNS datetime
556 | BEGIN
557 | # Copyright (C) 2011-2012 Mehran . M . Spitman
558 | # WebLog spitman.azdaa.com
559 | # Version V1.0.1
560 |
561 | DECLARE
562 | i, j, e, k, mo,
563 | gy, gm, gd,
564 | g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, jd, jy, jm,bkab1,j1
565 | INT DEFAULT 0; /* ### Can't be unsigned int! ### */
566 | DECLARE resout char(100);
567 | DECLARE jdd, jyd, jmd, jt varchar(100);
568 | DECLARE fdate datetime;
569 |
570 | SET jdd = SUBSTRING_INDEX(jdat, '/', -1);
571 | SET jt = SUBSTRING_INDEX(jdat, '/', 2);
572 | SET jyd = SUBSTRING_INDEX(jt, '/', 1);
573 | SET jmd = SUBSTRING_INDEX(jt, '/', -1);
574 | SET jd = CAST(jdd as SIGNED);
575 | SET jy = CAST(jyd as SIGNED);
576 | SET jm = CAST(jmd as SIGNED);
577 |
578 |
579 | SET bkab = __mymod(jy,33);
580 |
581 | IF (bkab = 1 or bkab= 5 or bkab = 9 or bkab = 13 or bkab = 17 or bkab = 22 or bkab = 26 or bkab = 30) THEN
582 | SET j=1;
583 | end IF;
584 |
585 | SET bkab1 = __mymod(jy+1,33);
586 |
587 | IF (bkab1 = 1 or bkab1= 5 or bkab1 = 9 or bkab1 = 13 or bkab1 = 17 or bkab1 = 22 or bkab1 = 26 or bkab1 = 30) THEN
588 | SET j1=1;
589 | end IF;
590 |
591 | CASE jm
592 | WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
593 | WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
594 | WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
595 | WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
596 | WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
597 | WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
598 | WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
599 | WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
600 | WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
601 | WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
602 | WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
603 | WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
604 | END CASE;
605 | IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
606 | IF jy <= 0 THEN SET e=1; end IF;
607 |
608 | IF e>0 THEN
609 | RETURN 0;
610 | end IF;
611 |
612 | IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
613 | SET i=1;
614 | end IF;
615 | SET gy = jy + 621 + i;
616 |
617 | IF (__mymod(gy,4)=0) THEN
618 | SET k=1;
619 | end IF;
620 |
621 | IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
622 | SET k=0;
623 | END IF;
624 |
625 | SET jmm=jm-1;
626 |
627 | WHILE (jmm > 0) do
628 | SET mday=mday+_jdmarray2(jmm);
629 | SET jmm=jmm-1;
630 | end WHILE;
631 |
632 | SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
633 | SET g_day_no=j_day_no+226899;
634 |
635 |
636 | SET g_day_no=g_day_no-(__mydiv(gy-1,4));
637 | SET g_day_mo=__mymod(g_day_no,365);
638 |
639 | IF (k=1 and j=1) THEN
640 | IF (g_day_mo=0) THEN
641 | RETURN CONCAT_WS('-',gy,'12','30');
642 | END IF;
643 | IF (g_day_mo=1) THEN
644 | RETURN CONCAT_WS('-',gy,'12','31');
645 | END IF;
646 | END IF;
647 |
648 | IF (g_day_mo=0) THEN
649 | RETURN CONCAT_WS('-',gy,'12','31');
650 | END IF;
651 |
652 |
653 | SET mo=0;
654 | SET gm=gm+1;
655 | while g_day_mo>_gdmarray2(mo,k) do
656 | SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
657 | SET mo=mo+1;
658 | SET gm=gm+1;
659 | end WHILE;
660 | SET gd=g_day_mo;
661 |
662 | RETURN CONCAT_WS('-',gy,gm,gd);
663 | END;;
664 | DELIMITER ;
665 |
--------------------------------------------------------------------------------
/pdate-v2.sql:
--------------------------------------------------------------------------------
1 | -- Gregorian - Jalali Date Converter Functions for Mysql, v2.0.0
2 | -- Copyright (C) 2019 Mohammad Saleh Souzanchi(saleh.souzanchi@gmail.com|https://github.com/zoghal), Mehran . M . Spitman
3 | --
4 | -- This program is free software: you can redistribute it and/or modify
5 | -- it under the terms of the GNU General Public License as published by
6 | -- the Free Software Foundation, either version 3 of the License, or
7 | -- (at your option) any later version.
8 | --
9 | -- This program is distributed in the hope that it will be useful,
10 | -- but WITHOUT ANY WARRANTY; without even the implied warranty of
11 | -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 | -- GNU General Public License for more details.
13 | --
14 | -- You should have received a copy of the GNU General Public License
15 | -- along with this program. If not, see .
16 | -- Pathed by Amir Mirmoeini (Added read-only + deterministic flags to prevent errors in new and strict MySql or MariaDB environments)
17 |
18 |
19 |
20 | -- ----------------------------
21 | -- Function structure for `__mydiv`
22 | -- ----------------------------
23 | DROP FUNCTION IF EXISTS `__mydiv`;
24 | DELIMITER ;;
25 | CREATE DEFINER=`root`@`localhost` FUNCTION `__mydiv`(`a` int, `b` int) RETURNS bigint(20)
26 | READS SQL DATA
27 | DETERMINISTIC
28 | BEGIN
29 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
30 | # WebLog : www.saleh.soozanchi.ir
31 | # Version V2.0.0
32 |
33 | return FLOOR(a / b);
34 | END;;
35 | DELIMITER ;
36 |
37 | -- ----------------------------
38 | -- Function structure for `__mymod`
39 | -- ----------------------------
40 | DROP FUNCTION IF EXISTS `__mymod`;
41 | DELIMITER ;;
42 | CREATE DEFINER=`root`@`localhost` FUNCTION `__mymod`(`a` int, `b` int) RETURNS bigint(20)
43 | READS SQL DATA
44 | DETERMINISTIC
45 | BEGIN
46 | # Copyright (C) 2011-2019 Mehran . M . Spitman
47 | # WebLog :spitman.azdaa.com
48 | # Version V2.0.0
49 |
50 | return (a - b * FLOOR(a / b));
51 | END;;
52 | DELIMITER ;
53 |
54 | -- ----------------------------
55 | -- Function structure for `_gdmarray`
56 | -- ----------------------------
57 | DROP FUNCTION IF EXISTS `_gdmarray`;
58 | DELIMITER ;;
59 | CREATE DEFINER=`root`@`localhost` FUNCTION `_gdmarray`(`m` smallint) RETURNS smallint(2)
60 | READS SQL DATA
61 | DETERMINISTIC
62 | BEGIN
63 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
64 | # WebLog : www.saleh.soozanchi.ir
65 | # Version V2.0.0
66 |
67 | CASE m
68 | WHEN 0 THEN RETURN 31;
69 | WHEN 1 THEN RETURN 28;
70 | WHEN 2 THEN RETURN 31;
71 | WHEN 3 THEN RETURN 30;
72 | WHEN 4 THEN RETURN 31;
73 | WHEN 5 THEN RETURN 30;
74 | WHEN 6 THEN RETURN 31;
75 | WHEN 7 THEN RETURN 31;
76 | WHEN 8 THEN RETURN 30;
77 | WHEN 9 THEN RETURN 31;
78 | WHEN 10 THEN RETURN 30;
79 | WHEN 11 THEN RETURN 31;
80 | END CASE;
81 |
82 | END;;
83 | DELIMITER ;
84 |
85 | -- ----------------------------
86 | -- Function structure for `_jdmarray`
87 | -- ----------------------------
88 | DROP FUNCTION IF EXISTS `_jdmarray`;
89 | DELIMITER ;;
90 | CREATE DEFINER=`root`@`localhost` FUNCTION `_jdmarray`(`m` smallint) RETURNS smallint(2)
91 | READS SQL DATA
92 | DETERMINISTIC
93 | BEGIN
94 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
95 | # WebLog : www.saleh.soozanchi.ir
96 | # Version V2.0.0
97 |
98 | CASE m
99 | WHEN 0 THEN RETURN 31;
100 | WHEN 1 THEN RETURN 31;
101 | WHEN 2 THEN RETURN 31;
102 | WHEN 3 THEN RETURN 31;
103 | WHEN 4 THEN RETURN 31;
104 | WHEN 5 THEN RETURN 31;
105 | WHEN 6 THEN RETURN 30;
106 | WHEN 7 THEN RETURN 30;
107 | WHEN 8 THEN RETURN 30;
108 | WHEN 9 THEN RETURN 30;
109 | WHEN 10 THEN RETURN 30;
110 | WHEN 11 THEN RETURN 29;
111 | END CASE;
112 |
113 | END;;
114 | DELIMITER ;
115 |
116 | -- ----------------------------
117 | -- Function structure for `_jdmarray2`
118 | -- ----------------------------
119 | DROP FUNCTION IF EXISTS `_jdmarray2`;
120 | DELIMITER ;;
121 | CREATE DEFINER=`root`@`localhost` FUNCTION `_jdmarray2`(`m` smallint) RETURNS smallint(2)
122 | READS SQL DATA
123 | DETERMINISTIC
124 | BEGIN
125 | # Copyright (C) 2011-2019 Mehran . M . Spitman
126 | # WebLog :spitman.azdaa.com
127 | # Version V2.0.0
128 |
129 | CASE m
130 | WHEN 1 THEN RETURN 31;
131 | WHEN 2 THEN RETURN 31;
132 | WHEN 3 THEN RETURN 31;
133 | WHEN 4 THEN RETURN 31;
134 | WHEN 5 THEN RETURN 31;
135 | WHEN 6 THEN RETURN 31;
136 | WHEN 7 THEN RETURN 30;
137 | WHEN 8 THEN RETURN 30;
138 | WHEN 9 THEN RETURN 30;
139 | WHEN 10 THEN RETURN 30;
140 | WHEN 11 THEN RETURN 30;
141 | WHEN 12 THEN RETURN 29;
142 | END CASE;
143 |
144 | END;;
145 | DELIMITER ;
146 |
147 | -- ----------------------------
148 | -- Function structure for `pdate`
149 | -- ----------------------------
150 | DROP FUNCTION IF EXISTS `pdate`;
151 | DELIMITER ;;
152 | CREATE DEFINER=`root`@`localhost` FUNCTION `pdate`(`gdate` datetime) RETURNS char(100) CHARSET utf8
153 | READS SQL DATA
154 | DETERMINISTIC
155 | BEGIN
156 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
157 | # WebLog : www.saleh.soozanchi.ir
158 | # Version V2.0.0
159 |
160 | DECLARE
161 | i,
162 | gy, gm, gd,
163 | g_day_no, j_day_no, j_np,jy INT DEFAULT 0; /* Can be unsigned int? */
164 | DECLARE jm, jd INT(2) ZEROFILL DEFAULT 0;
165 | DECLARE resout char(100);
166 | DECLARE ttime CHAR(20);
167 |
168 | SET gy = YEAR(gdate) - 1600;
169 | SET gm = MONTH(gdate) - 1;
170 | SET gd = DAY(gdate) - 1;
171 | SET ttime = TIME(gdate);
172 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv (gy + 399, 400));
173 | SET i = 0;
174 |
175 | WHILE (i < gm) do
176 | SET g_day_no = g_day_no + _gdmarray(i);
177 | SET i = i + 1;
178 | END WHILE;
179 |
180 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
181 | SET g_day_no = g_day_no + 1;
182 | END IF;
183 |
184 | SET g_day_no = g_day_no + gd;
185 | SET j_day_no = g_day_no - 79;
186 | SET j_np = j_day_no DIV 12053;
187 | SET j_day_no = j_day_no % 12053;
188 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
189 | SET j_day_no = j_day_no % 1461;
190 |
191 | IF j_day_no >= 366 then
192 | SET jy = jy + __mydiv(j_day_no - 1, 365);
193 | SET j_day_no = (j_day_no - 1) % 365;
194 | END IF;
195 |
196 | SET i = 0;
197 |
198 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
199 | SET j_day_no = j_day_no - _jdmarray(i);
200 | SET i = i + 1;
201 | END WHILE;
202 |
203 | SET jm = i + 1;
204 | SET jd = j_day_no + 1;
205 | SET resout = CONCAT_WS ('-', jy, jm, jd);
206 |
207 | IF (ttime <> '00:00:00') then
208 | SET resout = CONCAT_WS(' ', resout, ttime);
209 | END IF;
210 |
211 | RETURN resout;
212 | END;;
213 | DELIMITER ;
214 |
215 | -- ----------------------------
216 | -- Function structure for `PMONTH`
217 | -- ----------------------------
218 | DROP FUNCTION IF EXISTS `PMONTH`;
219 | DELIMITER ;;
220 | CREATE DEFINER=`root`@`localhost` FUNCTION `PMONTH`(`gdate` datetime) RETURNS char(100) CHARSET utf8
221 | READS SQL DATA
222 | DETERMINISTIC
223 | BEGIN
224 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
225 | # WebLog : www.saleh.soozanchi.ir
226 | # Version V2.0.0
227 |
228 | DECLARE
229 | i,
230 | gy, gm, gd,
231 | g_day_no, j_day_no, j_np,
232 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
233 |
234 | SET gy = YEAR(gdate) - 1600;
235 | SET gm = MONTH(gdate) - 1;
236 | SET gd = DAY(gdate) - 1;
237 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
238 | SET i = 0;
239 |
240 | WHILE (i < gm) do
241 | SET g_day_no = g_day_no + _gdmarray(i);
242 | SET i = i + 1;
243 | END WHILE;
244 |
245 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
246 | SET g_day_no = g_day_no + 1;
247 | END IF;
248 |
249 | SET g_day_no = g_day_no + gd;
250 | SET j_day_no = g_day_no - 79;
251 | SET j_np = j_day_no DIV 12053;
252 | set j_day_no = j_day_no % 12053;
253 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
254 | SET j_day_no = j_day_no % 1461;
255 |
256 | IF j_day_no >= 366 then
257 | SET jy = jy + __mydiv(j_day_no - 1, 365);
258 | SET j_day_no =(j_day_no - 1) % 365;
259 | END IF;
260 |
261 | SET i = 0;
262 |
263 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
264 | SET j_day_no = j_day_no - _jdmarray(i);
265 | SET i = i + 1;
266 | END WHILE;
267 |
268 | SET jm = i + 1;
269 | SET jd = j_day_no + 1;
270 | RETURN jm;
271 | END;;
272 | DELIMITER ;
273 |
274 | -- ----------------------------
275 | -- Function structure for `pmonthname`
276 | -- ----------------------------
277 | DROP FUNCTION IF EXISTS `pmonthname`;
278 | DELIMITER ;;
279 | CREATE DEFINER=`root`@`localhost` FUNCTION `pmonthname`(`gdate` datetime) RETURNS varchar(100) CHARSET utf8
280 | READS SQL DATA
281 | DETERMINISTIC
282 | BEGIN
283 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
284 | # WebLog : www.saleh.soozanchi.ir
285 | # Version V2.0.0
286 |
287 | CASE PMONTH(gdate)
288 | WHEN 1 THEN RETURN 'فروردین';
289 | WHEN 2 THEN RETURN 'اردیبهشت';
290 | WHEN 3 THEN RETURN 'خرداد';
291 | WHEN 4 THEN RETURN 'تیر';
292 | WHEN 5 THEN RETURN 'مرداد';
293 | WHEN 6 THEN RETURN 'شهریور';
294 | WHEN 7 THEN RETURN 'مهر';
295 | WHEN 8 THEN RETURN 'آبان';
296 | WHEN 9 THEN RETURN 'آذر';
297 | WHEN 10 THEN RETURN 'دی';
298 | WHEN 11 THEN RETURN 'بهمن';
299 | WHEN 12 THEN RETURN 'اسفند';
300 | END CASE;
301 |
302 | END;;
303 | DELIMITER ;
304 |
305 | -- ----------------------------
306 | -- Function structure for `pyear`
307 | -- ----------------------------
308 | DROP FUNCTION IF EXISTS `pyear`;
309 | DELIMITER ;;
310 | CREATE DEFINER=`root`@`localhost` FUNCTION `pyear`(`gdate` datetime) RETURNS char(100) CHARSET utf8
311 | READS SQL DATA
312 | DETERMINISTIC
313 | BEGIN
314 | # Copyright (C) 2009-2019 Mohammad Saleh Souzanchi
315 | # WebLog : www.saleh.soozanchi.ir
316 | # Version V2.0.0
317 |
318 | DECLARE
319 | i,
320 | gy, gm, gd,
321 | g_day_no, j_day_no, j_np,
322 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
323 |
324 | SET gy = YEAR(gdate) - 1600;
325 | SET gm = MONTH(gdate) - 1;
326 | SET gd = DAY(gdate) - 1;
327 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
328 | SET i = 0;
329 |
330 | WHILE (i < gm) do
331 | SET g_day_no = g_day_no + _gdmarray(i);
332 | SET i = i + 1;
333 | END WHILE;
334 |
335 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
336 | SET g_day_no = g_day_no + 1;
337 | END IF;
338 |
339 | SET g_day_no = g_day_no + gd;
340 | SET j_day_no = g_day_no - 79;
341 | SET j_np = j_day_no DIV 12053;
342 | set j_day_no = j_day_no % 12053;
343 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
344 | SET j_day_no = j_day_no % 1461;
345 |
346 | IF j_day_no >= 366 then
347 | SET jy = jy + __mydiv(j_day_no - 1, 365);
348 | SET j_day_no = (j_day_no - 1) % 365;
349 | END IF;
350 |
351 | SET i = 0;
352 |
353 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
354 | SET j_day_no = j_day_no - _jdmarray(i);
355 | SET i = i + 1;
356 | END WHILE;
357 |
358 | SET jm = i + 1;
359 | SET jd = j_day_no + 1;
360 | RETURN jy;
361 | END;;
362 | DELIMITER ;
363 |
364 | -- ----------------------------
365 | -- Function structure for `pday`
366 | -- ----------------------------
367 | DROP FUNCTION IF EXISTS `pday`;
368 | DELIMITER ;;
369 | CREATE DEFINER=`root`@`localhost` FUNCTION `pday`(`gdate` datetime) RETURNS char(100) CHARSET utf8
370 | READS SQL DATA
371 | DETERMINISTIC
372 | BEGIN
373 | # Copyright (C) 2011-2019 Mohammad Saleh Souzanchi, Mehran . M . Spitman
374 | # WebLog : www.saleh.soozanchi.ir, spitman.azdaa.com
375 | # Version V2.0.0
376 |
377 | DECLARE
378 | i,
379 | gy, gm, gd,
380 | g_day_no, j_day_no, j_np,
381 | jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
382 |
383 | SET gy = YEAR(gdate) - 1600;
384 | SET gm = MONTH(gdate) - 1;
385 | SET gd = DAY(gdate) - 1;
386 | SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99 , 100) + __mydiv(gy + 399, 400));
387 | SET i = 0;
388 |
389 | WHILE (i < gm) do
390 | SET g_day_no = g_day_no + _gdmarray(i);
391 | SET i = i + 1;
392 | END WHILE;
393 |
394 | IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
395 | SET g_day_no = g_day_no + 1;
396 | END IF;
397 |
398 | SET g_day_no = g_day_no + gd;
399 | SET j_day_no = g_day_no - 79;
400 | SET j_np = j_day_no DIV 12053;
401 | SET j_day_no = j_day_no % 12053;
402 | SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
403 | SET j_day_no = j_day_no % 1461;
404 |
405 | IF j_day_no >= 366 then
406 | SET jy = jy + __mydiv(j_day_no - 1, 365);
407 | SET j_day_no = (j_day_no-1) % 365;
408 | END IF;
409 |
410 | SET i = 0;
411 |
412 | WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
413 | SET j_day_no = j_day_no - _jdmarray(i);
414 | SET i = i + 1;
415 | END WHILE;
416 |
417 | SET jm = i + 1;
418 | SET jd = j_day_no + 1;
419 | RETURN jd;
420 | END;;
421 | DELIMITER ;
422 |
423 |
424 | -- ----------------------------
425 | -- Function structure for `_gdmarray2`
426 | -- ----------------------------
427 | DROP FUNCTION IF EXISTS `_gdmarray2`;
428 | DELIMITER ;;
429 | CREATE DEFINER=`root`@`localhost` FUNCTION `_gdmarray2`(`m` smallint, `k` SMALLINT) RETURNS smallint(2)
430 | READS SQL DATA
431 | DETERMINISTIC
432 | BEGIN
433 | # Copyright (C) 2011-2019 Mehran . M . Spitman
434 | # WebLog :spitman.azdaa.com
435 | # Version V2.0.0
436 |
437 | CASE m
438 | WHEN 0 THEN RETURN 31;
439 | WHEN 1 THEN RETURN 28+k;
440 | WHEN 2 THEN RETURN 31;
441 | WHEN 3 THEN RETURN 30;
442 | WHEN 4 THEN RETURN 31;
443 | WHEN 5 THEN RETURN 30;
444 | WHEN 6 THEN RETURN 31;
445 | WHEN 7 THEN RETURN 31;
446 | WHEN 8 THEN RETURN 30;
447 | WHEN 9 THEN RETURN 31;
448 | WHEN 10 THEN RETURN 30;
449 | WHEN 11 THEN RETURN 31;
450 | END CASE;
451 |
452 |
453 | END;;
454 | DELIMITER ;
455 |
456 | -- ----------------------------
457 | -- Function structure for `gdate`
458 | -- ----------------------------
459 | DROP FUNCTION IF EXISTS `gdate`;
460 | DELIMITER ;;
461 | CREATE DEFINER=`root`@`localhost` FUNCTION `gdate`(`jy` smallint, `jm` smallint, `jd` smallint) RETURNS datetime
462 | READS SQL DATA
463 | DETERMINISTIC
464 | BEGIN
465 | # Copyright (C) 2011-2019 Mehran . M . Spitman
466 | # WebLog :spitman.azdaa.com
467 | # Version V2.0.0
468 |
469 | DECLARE
470 | i, j, e, k, mo,
471 | gy, gm, gd,
472 | g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, bkab1, j1
473 | INT DEFAULT 0; /* Can be unsigned int? */
474 | DECLARE fdate datetime;
475 |
476 |
477 | SET bkab = __mymod(jy,33);
478 |
479 | IF (bkab = 1 or bkab= 5 or bkab = 9 or bkab = 13 or bkab = 17 or bkab = 22 or bkab = 26 or bkab = 30) THEN
480 | SET j=1;
481 | end IF;
482 |
483 | SET bkab1 = __mymod(jy+1,33);
484 |
485 | IF (bkab1 = 1 or bkab1= 5 or bkab1 = 9 or bkab1 = 13 or bkab1 = 17 or bkab1 = 22 or bkab1 = 26 or bkab1 = 30) THEN
486 | SET j1=1;
487 | end IF;
488 |
489 | CASE jm
490 | WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
491 | WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
492 | WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
493 | WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
494 | WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
495 | WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
496 | WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
497 | WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
498 | WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
499 | WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
500 | WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
501 | WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
502 | END CASE;
503 | IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
504 | IF jy <= 0 THEN SET e=1; end IF;
505 |
506 | IF e>0 THEN
507 | RETURN 0;
508 | end IF;
509 |
510 | IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
511 | SET i=1;
512 | end IF;
513 | SET gy = jy + 621 + i;
514 |
515 | IF (__mymod(gy,4)=0) THEN
516 | SET k=1;
517 | end IF;
518 |
519 | IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
520 | SET k=0;
521 | END IF;
522 |
523 | SET jmm=jm-1;
524 |
525 | WHILE (jmm > 0) do
526 | SET mday=mday+_jdmarray2(jmm);
527 | SET jmm=jmm-1;
528 | end WHILE;
529 |
530 | SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
531 | SET g_day_no=j_day_no+226899;
532 |
533 |
534 | SET g_day_no=g_day_no-(__mydiv(gy-1,4));
535 | SET g_day_mo=__mymod(g_day_no,365);
536 |
537 | IF (k=1 and j=1) THEN
538 | IF (g_day_mo=0) THEN
539 | RETURN CONCAT_WS('-',gy,'12','30');
540 | END IF;
541 | IF (g_day_mo=1) THEN
542 | RETURN CONCAT_WS('-',gy,'12','31');
543 | END IF;
544 | END IF;
545 |
546 | IF (g_day_mo=0) THEN
547 | RETURN CONCAT_WS('-',gy,'12','31');
548 | END IF;
549 |
550 |
551 | SET mo=0;
552 | SET gm=gm+1;
553 | while g_day_mo>_gdmarray2(mo,k) do
554 | SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
555 | SET mo=mo+1;
556 | SET gm=gm+1;
557 | end WHILE;
558 | SET gd=g_day_mo;
559 |
560 | RETURN CONCAT_WS('-',gy,gm,gd);
561 | END;;
562 | DELIMITER ;
563 |
564 | -- ----------------------------
565 | -- Function structure for `gdatestr`
566 | -- ----------------------------
567 | DROP FUNCTION IF EXISTS `gdatestr`;
568 | DELIMITER ;;
569 | CREATE DEFINER=`root`@`localhost` FUNCTION `gdatestr`(`jdat` char(10)) RETURNS datetime
570 | READS SQL DATA
571 | DETERMINISTIC
572 | BEGIN
573 | # Copyright (C) 2011-2019 Mehran . M . Spitman
574 | # WebLog spitman.azdaa.com
575 | # Version V2.0.0
576 |
577 | DECLARE
578 | i, j, e, k, mo,
579 | gy, gm, gd,
580 | g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, jd, jy, jm,bkab1,j1
581 | INT DEFAULT 0; /* ### Can't be unsigned int! ### */
582 | DECLARE jdd, jyd, jmd, jt varchar(100);
583 | DECLARE fdate datetime;
584 |
585 | SET jdd = SUBSTRING_INDEX(jdat, '/', -1);
586 | SET jt = SUBSTRING_INDEX(jdat, '/', 2);
587 | SET jyd = SUBSTRING_INDEX(jt, '/', 1);
588 | SET jmd = SUBSTRING_INDEX(jt, '/', -1);
589 | SET jd = CAST(jdd as SIGNED);
590 | SET jy = CAST(jyd as SIGNED);
591 | SET jm = CAST(jmd as SIGNED);
592 |
593 |
594 | SET bkab = __mymod(jy,33);
595 |
596 | IF (bkab = 1 or bkab= 5 or bkab = 9 or bkab = 13 or bkab = 17 or bkab = 22 or bkab = 26 or bkab = 30) THEN
597 | SET j=1;
598 | end IF;
599 |
600 | SET bkab1 = __mymod(jy+1,33);
601 |
602 | IF (bkab1 = 1 or bkab1= 5 or bkab1 = 9 or bkab1 = 13 or bkab1 = 17 or bkab1 = 22 or bkab1 = 26 or bkab1 = 30) THEN
603 | SET j1=1;
604 | end IF;
605 |
606 | CASE jm
607 | WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
608 | WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
609 | WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
610 | WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
611 | WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
612 | WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
613 | WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
614 | WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
615 | WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
616 | WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
617 | WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
618 | WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
619 | END CASE;
620 | IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
621 | IF jy <= 0 THEN SET e=1; end IF;
622 |
623 | IF e>0 THEN
624 | RETURN 0;
625 | end IF;
626 |
627 | IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
628 | SET i=1;
629 | end IF;
630 | SET gy = jy + 621 + i;
631 |
632 | IF (__mymod(gy,4)=0) THEN
633 | SET k=1;
634 | end IF;
635 |
636 | IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
637 | SET k=0;
638 | END IF;
639 |
640 | SET jmm=jm-1;
641 |
642 | WHILE (jmm > 0) do
643 | SET mday=mday+_jdmarray2(jmm);
644 | SET jmm=jmm-1;
645 | end WHILE;
646 |
647 | SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
648 | SET g_day_no=j_day_no+226899;
649 |
650 |
651 | SET g_day_no=g_day_no-(__mydiv(gy-1,4));
652 | SET g_day_mo=__mymod(g_day_no,365);
653 |
654 | IF (k=1 and j=1) THEN
655 | IF (g_day_mo=0) THEN
656 | RETURN CONCAT_WS('-',gy,'12','30');
657 | END IF;
658 | IF (g_day_mo=1) THEN
659 | RETURN CONCAT_WS('-',gy,'12','31');
660 | END IF;
661 | END IF;
662 |
663 | IF (g_day_mo=0) THEN
664 | RETURN CONCAT_WS('-',gy,'12','31');
665 | END IF;
666 |
667 |
668 | SET mo=0;
669 | SET gm=gm+1;
670 | while g_day_mo>_gdmarray2(mo,k) do
671 | SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
672 | SET mo=mo+1;
673 | SET gm=gm+1;
674 | end WHILE;
675 | SET gd=g_day_mo;
676 |
677 | RETURN CONCAT_WS('-',gy,gm,gd);
678 | END;;
679 | DELIMITER ;
680 |
--------------------------------------------------------------------------------