Advertisement
Guest User

PDate Deterministic

a guest
Oct 15th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 18.12 KB | None | 0 0
  1. --    Gregorian - Jalali Date Converter Functions for Mysql
  2. --    Copyright (C) 2012  Mohammad Saleh Souzanchi, 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 <http://www.gnu.org/licenses/>.
  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-2012 Mohammad Saleh Souzanchi
  30. # WebLog : www.saleh.soozanchi.ir
  31. # Version V1.0.2
  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-2012 Mehran . M . Spitman
  47. # WebLog :spitman.azdaa.com
  48. # Version V1.0.2
  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-2012 Mohammad Saleh Souzanchi
  64. # WebLog : www.saleh.soozanchi.ir
  65. # Version V1.0.1
  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-2012 Mohammad Saleh Souzanchi
  95. # WebLog : www.saleh.soozanchi.ir
  96. # Version V1.0.1
  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-2012 Mehran . M . Spitman
  126. # WebLog :spitman.azdaa.com
  127. # Version V1.0.1
  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-2012 Mohammad Saleh Souzanchi
  157. # WebLog : www.saleh.soozanchi.ir
  158. # Version V1.0.2
  159.  
  160.     DECLARE
  161.         i,
  162.         gy, gm, gd,
  163.         g_day_no, j_day_no, j_np,
  164.         jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
  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-2012 Mohammad Saleh Souzanchi
  225. # WebLog : www.saleh.soozanchi.ir
  226. # Version V1.0.2
  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.     DECLARE resout char(100);
  234.     DECLARE ttime CHAR(20);
  235.  
  236.     SET gy = YEAR(gdate) - 1600;
  237.     SET gm = MONTH(gdate) - 1;
  238.     SET gd = DAY(gdate) - 1;
  239.     SET ttime = TIME(gdate);
  240.     SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
  241.     SET i = 0;
  242.  
  243.     WHILE (i < gm) do
  244.         SET g_day_no = g_day_no + _gdmarray(i);
  245.         SET i = i + 1;
  246.     END WHILE;
  247.  
  248.     IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
  249.         SET g_day_no = g_day_no + 1;
  250.     END IF;
  251.  
  252.     SET g_day_no = g_day_no + gd;
  253.     SET j_day_no = g_day_no - 79;
  254.     SET j_np = j_day_no DIV 12053;
  255.     set j_day_no = j_day_no % 12053;
  256.     SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
  257.     SET j_day_no = j_day_no % 1461;
  258.  
  259.     IF j_day_no >= 366 then
  260.         SET jy = jy + __mydiv(j_day_no - 1, 365);
  261.         SET j_day_no =(j_day_no - 1) % 365;
  262.     END IF;
  263.  
  264.     SET i = 0;
  265.  
  266.     WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
  267.         SET j_day_no = j_day_no - _jdmarray(i);
  268.         SET i = i + 1;
  269.     END WHILE;
  270.  
  271.     SET jm = i + 1;
  272.     SET jd = j_day_no + 1;
  273.     RETURN jm;
  274. END;;
  275. DELIMITER ;
  276.  
  277. -- ----------------------------
  278. -- Function structure for `pmonthname`
  279. -- ----------------------------
  280. DROP FUNCTION IF EXISTS `pmonthname`;
  281. DELIMITER ;;
  282. CREATE DEFINER=`root`@`localhost` FUNCTION `pmonthname`(`gdate` datetime) RETURNS varchar(100) CHARSET utf8
  283. READS SQL DATA
  284. DETERMINISTIC
  285. BEGIN
  286. # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
  287. # WebLog : www.saleh.soozanchi.ir
  288. # Version V1.0.1
  289.  
  290.     CASE PMONTH(gdate)
  291.         WHEN 1 THEN RETURN 'فروردین';
  292.         WHEN 2 THEN RETURN 'اردیبهشت';
  293.         WHEN 3 THEN RETURN 'خرداد';
  294.         WHEN 4 THEN RETURN 'تیر';
  295.         WHEN 5 THEN RETURN 'مرداد';
  296.         WHEN 6 THEN RETURN 'شهریور';
  297.         WHEN 7 THEN RETURN 'مهر';
  298.         WHEN 8 THEN RETURN 'آبان';
  299.         WHEN 9 THEN RETURN 'آذر';
  300.         WHEN 10 THEN RETURN 'دی';
  301.         WHEN 11 THEN RETURN 'بهمن';
  302.         WHEN 12 THEN RETURN 'اسفند';
  303.     END CASE;
  304.  
  305. END;;
  306. DELIMITER ;
  307.  
  308. -- ----------------------------
  309. -- Function structure for `pyear`
  310. -- ----------------------------
  311. DROP FUNCTION IF EXISTS `pyear`;
  312. DELIMITER ;;
  313. CREATE DEFINER=`root`@`localhost` FUNCTION `pyear`(`gdate` datetime) RETURNS char(100) CHARSET utf8
  314. READS SQL DATA
  315. DETERMINISTIC
  316. BEGIN
  317. # Copyright (C) 2009-2012 Mohammad Saleh Souzanchi
  318. # WebLog : www.saleh.soozanchi.ir
  319. # Version V1.0.1
  320.  
  321.     DECLARE
  322.         i,
  323.         gy, gm, gd,
  324.         g_day_no, j_day_no, j_np,
  325.         jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
  326.     DECLARE resout char(100);
  327.     DECLARE ttime CHAR(20);
  328.  
  329.     SET gy = YEAR(gdate) - 1600;
  330.     SET gm = MONTH(gdate) - 1;
  331.     SET gd = DAY(gdate) - 1;
  332.     SET ttime = TIME(gdate);
  333.     SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99, 100) + __mydiv(gy + 399, 400));
  334.     SET i = 0;
  335.  
  336.     WHILE (i < gm) do
  337.         SET g_day_no = g_day_no + _gdmarray(i);
  338.         SET i = i + 1;
  339.     END WHILE;
  340.  
  341.     IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
  342.         SET g_day_no =  g_day_no + 1;
  343.     END IF;
  344.  
  345.     SET g_day_no = g_day_no + gd;
  346.     SET j_day_no = g_day_no - 79;
  347.     SET j_np = j_day_no DIV 12053;
  348.     set j_day_no = j_day_no % 12053;
  349.     SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
  350.     SET j_day_no = j_day_no % 1461;
  351.  
  352.     IF j_day_no >= 366 then
  353.         SET jy = jy + __mydiv(j_day_no - 1, 365);
  354.         SET j_day_no = (j_day_no - 1) % 365;
  355.     END IF;
  356.  
  357.     SET i = 0;
  358.  
  359.     WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
  360.         SET j_day_no = j_day_no - _jdmarray(i);
  361.         SET i = i + 1;
  362.     END WHILE;
  363.  
  364.     SET jm = i + 1;
  365.     SET jd = j_day_no + 1;
  366.     RETURN jy;
  367. END;;
  368. DELIMITER ;
  369.  
  370. -- ----------------------------
  371. -- Function structure for `pday`
  372. -- ----------------------------
  373. DROP FUNCTION IF EXISTS `pday`;
  374. DELIMITER ;;
  375. CREATE DEFINER=`root`@`localhost` FUNCTION `pday`(`gdate` datetime) RETURNS char(100) CHARSET utf8
  376. READS SQL DATA
  377. DETERMINISTIC
  378. BEGIN
  379. # Copyright (C) 2011-2012 Mohammad Saleh Souzanchi, Mehran . M . Spitman
  380. # WebLog : www.saleh.soozanchi.ir, spitman.azdaa.com
  381. # Version V1.0.1
  382.  
  383.     DECLARE
  384.         i,
  385.         gy, gm, gd,
  386.         g_day_no, j_day_no, j_np,
  387.         jy, jm, jd INT DEFAULT 0; /* Can be unsigned int? */
  388.     DECLARE resout char(100);
  389.     DECLARE ttime CHAR(20);
  390.  
  391.     SET gy = YEAR(gdate) - 1600;
  392.     SET gm = MONTH(gdate) - 1;
  393.     SET gd = DAY(gdate) - 1;
  394.     SET ttime = TIME(gdate);
  395.     SET g_day_no = ((365 * gy) + __mydiv(gy + 3, 4) - __mydiv(gy + 99 , 100) + __mydiv(gy + 399, 400));
  396.     SET i = 0;
  397.  
  398.     WHILE (i < gm) do
  399.         SET g_day_no = g_day_no + _gdmarray(i);
  400.         SET i = i + 1;
  401.     END WHILE;
  402.  
  403.     IF gm > 1 and ((gy % 4 = 0 and gy % 100 <> 0)) or gy % 400 = 0 THEN
  404.         SET g_day_no = g_day_no + 1;
  405.     END IF;
  406.  
  407.     SET g_day_no = g_day_no + gd;
  408.     SET j_day_no = g_day_no - 79;
  409.     SET j_np = j_day_no DIV 12053;
  410.     SET j_day_no = j_day_no % 12053;
  411.     SET jy = 979 + 33 * j_np + 4 * __mydiv(j_day_no, 1461);
  412.     SET j_day_no = j_day_no % 1461;
  413.  
  414.     IF j_day_no >= 366 then
  415.         SET jy = jy + __mydiv(j_day_no - 1, 365);
  416.         SET j_day_no = (j_day_no-1) % 365;
  417.     END IF;
  418.  
  419.     SET i = 0;
  420.  
  421.     WHILE (i < 11 and j_day_no >= _jdmarray(i)) do
  422.         SET j_day_no = j_day_no - _jdmarray(i);
  423.         SET i = i + 1;
  424.     END WHILE;
  425.  
  426.     SET jm = i + 1;
  427.     SET jd = j_day_no + 1;
  428.     RETURN jd;
  429. END;;
  430. DELIMITER ;
  431.  
  432.  
  433. -- ----------------------------
  434. -- Function structure for `_gdmarray2`
  435. -- ----------------------------
  436. DROP FUNCTION IF EXISTS `_gdmarray2`;
  437. DELIMITER ;;
  438. CREATE DEFINER=`root`@`localhost` FUNCTION `_gdmarray2`(`m` smallint, `k` SMALLINT) RETURNS smallint(2)
  439. READS SQL DATA
  440. DETERMINISTIC
  441. BEGIN
  442. # Copyright (C) 2011-2012  Mehran . M . Spitman
  443. # WebLog :spitman.azdaa.com
  444. # Version V1.0
  445.  
  446.     CASE m
  447.         WHEN 0 THEN RETURN 31;
  448.         WHEN 1 THEN RETURN 28+k;
  449.         WHEN 2 THEN RETURN 31;
  450.         WHEN 3 THEN RETURN 30;
  451.         WHEN 4 THEN RETURN 31;
  452.         WHEN 5 THEN RETURN 30;
  453.         WHEN 6 THEN RETURN 31;
  454.         WHEN 7 THEN RETURN 31;
  455.         WHEN 8 THEN RETURN 30;
  456.         WHEN 9 THEN RETURN 31;
  457.         WHEN 10 THEN RETURN 30;
  458.         WHEN 11 THEN RETURN 31;
  459.     END CASE;
  460.  
  461.  
  462. END;;
  463. DELIMITER ;
  464.  
  465. -- ----------------------------
  466. -- Function structure for `gdate`
  467. -- ----------------------------
  468. DROP FUNCTION IF EXISTS `gdate`;
  469. DELIMITER ;;
  470. CREATE DEFINER=`root`@`localhost` FUNCTION `gdate`(`jy` smallint, `jm` smallint, `jd` smallint) RETURNS datetime
  471. READS SQL DATA
  472. DETERMINISTIC
  473. BEGIN
  474. # Copyright (C) 2011-2012 Mehran . M . Spitman
  475. # WebLog :spitman.azdaa.com
  476. # Version V1.0.1
  477.  
  478.     DECLARE
  479.         i, j, e, k, mo,
  480.         gy, gm, gd,
  481.         g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, bkab1, j1
  482.     INT DEFAULT 0; /* Can be unsigned int? */
  483.     DECLARE resout char(100);
  484.     DECLARE fdate datetime;
  485.  
  486.  
  487.   SET bkab = __mymod(jy,33);
  488.  
  489.   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
  490.     SET j=1;
  491.   end IF;
  492.  
  493.   SET bkab1 = __mymod(jy+1,33);
  494.  
  495.   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
  496.     SET j1=1;
  497.   end IF;
  498.  
  499.     CASE jm
  500.         WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  501.         WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  502.         WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  503.         WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  504.         WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  505.         WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  506.         WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  507.         WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  508.         WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  509.         WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  510.         WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  511.         WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
  512.     END CASE;
  513.   IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
  514.   IF jy <= 0 THEN SET e=1; end IF;
  515.  
  516.   IF e>0 THEN
  517.     RETURN 0;
  518.   end IF;
  519.  
  520.   IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
  521.     SET i=1;
  522.   end IF;
  523.   SET gy = jy + 621 + i;
  524.  
  525.   IF (__mymod(gy,4)=0) THEN
  526.     SET k=1;
  527.   end IF;
  528.  
  529.     IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
  530.         SET k=0;
  531.     END IF;
  532.  
  533.   SET jmm=jm-1;
  534.  
  535.   WHILE (jmm > 0) do
  536.     SET mday=mday+_jdmarray2(jmm);
  537.     SET jmm=jmm-1;
  538.   end WHILE;
  539.  
  540.   SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
  541.   SET g_day_no=j_day_no+226899;
  542.  
  543.  
  544.   SET g_day_no=g_day_no-(__mydiv(gy-1,4));
  545.   SET g_day_mo=__mymod(g_day_no,365);
  546.  
  547.     IF (k=1 and j=1) THEN
  548.         IF (g_day_mo=0) THEN
  549.             RETURN CONCAT_WS('-',gy,'12','30');
  550.         END IF;
  551.         IF (g_day_mo=1) THEN
  552.             RETURN CONCAT_WS('-',gy,'12','31');
  553.         END IF;
  554.     END IF;
  555.  
  556.     IF (g_day_mo=0) THEN
  557.         RETURN CONCAT_WS('-',gy,'12','31');
  558.     END IF;
  559.  
  560.  
  561.   SET mo=0;
  562.   SET gm=gm+1;
  563.   while g_day_mo>_gdmarray2(mo,k) do
  564.         SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
  565.     SET mo=mo+1;
  566.     SET gm=gm+1;
  567.   end WHILE;
  568.   SET gd=g_day_mo;
  569.  
  570.   RETURN CONCAT_WS('-',gy,gm,gd);
  571. END;;
  572. DELIMITER ;
  573.  
  574. -- ----------------------------
  575. -- Function structure for `gdatestr`
  576. -- ----------------------------
  577. DROP FUNCTION IF EXISTS `gdatestr`;
  578. DELIMITER ;;
  579. CREATE DEFINER=`root`@`localhost` FUNCTION `gdatestr`(`jdat` char(10)) RETURNS datetime
  580. READS SQL DATA
  581. DETERMINISTIC
  582. BEGIN
  583. # Copyright (C) 2011-2012 Mehran . M . Spitman
  584. # WebLog spitman.azdaa.com
  585. # Version V1.0.1
  586.  
  587.     DECLARE
  588.         i, j, e, k, mo,
  589.         gy, gm, gd,
  590.         g_day_no, j_day_no, bkab, jmm, mday, g_day_mo, jd, jy, jm,bkab1,j1
  591.     INT DEFAULT 0; /* ### Can't be unsigned int! ### */
  592.     DECLARE resout char(100);
  593.     DECLARE jdd, jyd, jmd, jt varchar(100);
  594.     DECLARE fdate datetime;
  595.  
  596.     SET jdd = SUBSTRING_INDEX(jdat, '/', -1);
  597.     SET jt = SUBSTRING_INDEX(jdat, '/', 2);
  598.     SET jyd = SUBSTRING_INDEX(jt, '/', 1);
  599.     SET jmd = SUBSTRING_INDEX(jt, '/', -1);
  600.     SET jd = CAST(jdd as SIGNED);
  601.     SET jy = CAST(jyd as SIGNED);
  602.     SET jm = CAST(jmd as SIGNED);
  603.  
  604.  
  605.      SET bkab = __mymod(jy,33);
  606.  
  607.   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
  608.     SET j=1;
  609.   end IF;
  610.  
  611.   SET bkab1 = __mymod(jy+1,33);
  612.  
  613.   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
  614.     SET j1=1;
  615.   end IF;
  616.  
  617.     CASE jm
  618.         WHEN 1 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  619.         WHEN 2 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  620.         WHEN 3 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  621.         WHEN 4 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  622.         WHEN 5 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  623.         WHEN 6 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  624.         WHEN 7 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  625.         WHEN 8 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  626.         WHEN 9 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  627.         WHEN 10 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  628.         WHEN 11 THEN IF jd > _jdmarray2(jm) or jd <= 0 THEN SET e=1; end IF;
  629.         WHEN 12 THEN IF jd > _jdmarray2(jm)+j or jd <= 0 THEN SET e=1; end IF;
  630.     END CASE;
  631.   IF jm > 12 or jm <= 0 THEN SET e=1; end IF;
  632.   IF jy <= 0 THEN SET e=1; end IF;
  633.  
  634.   IF e>0 THEN
  635.     RETURN 0;
  636.   end IF;
  637.  
  638.   IF (jm>=11) or (jm=10 and jd>=11 and j=0) or (jm=10 and jd>11 and j=1) THEN
  639.     SET i=1;
  640.   end IF;
  641.   SET gy = jy + 621 + i;
  642.  
  643.   IF (__mymod(gy,4)=0) THEN
  644.     SET k=1;
  645.   end IF;
  646.  
  647.     IF (__mymod(gy,100)=0) and (__mymod(gy,400)<>0) THEN
  648.         SET k=0;
  649.     END IF;
  650.  
  651.   SET jmm=jm-1;
  652.  
  653.   WHILE (jmm > 0) do
  654.     SET mday=mday+_jdmarray2(jmm);
  655.     SET jmm=jmm-1;
  656.   end WHILE;
  657.  
  658.   SET j_day_no=(jy-1)*365+(__mydiv(jy,4))+mday+jd;
  659.   SET g_day_no=j_day_no+226899;
  660.  
  661.  
  662.   SET g_day_no=g_day_no-(__mydiv(gy-1,4));
  663.   SET g_day_mo=__mymod(g_day_no,365);
  664.  
  665.     IF (k=1 and j=1) THEN
  666.         IF (g_day_mo=0) THEN
  667.             RETURN CONCAT_WS('-',gy,'12','30');
  668.         END IF;
  669.         IF (g_day_mo=1) THEN
  670.             RETURN CONCAT_WS('-',gy,'12','31');
  671.         END IF;
  672.     END IF;
  673.  
  674.     IF (g_day_mo=0) THEN
  675.         RETURN CONCAT_WS('-',gy,'12','31');
  676.     END IF;
  677.  
  678.  
  679.   SET mo=0;
  680.   SET gm=gm+1;
  681.   while g_day_mo>_gdmarray2(mo,k) do
  682.         SET g_day_mo=g_day_mo-_gdmarray2(mo,k);
  683.     SET mo=mo+1;
  684.     SET gm=gm+1;
  685.   end WHILE;
  686.   SET gd=g_day_mo;
  687.  
  688.   RETURN CONCAT_WS('-',gy,gm,gd);
  689. END;;
  690. DELIMITER ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement