├── .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 | --------------------------------------------------------------------------------