Mysql String to date 类似于 php strtotime "last monday" 在存储过程中动态创建
Mysql Strting to date like php strtotime "last monday" with dynamic creation in stored procedures
我正在尝试创建存储过程来获取一个月内的字符串,例如 PHP 中的 strotime,如下所示。
例如
echo strtotime("last Monday"), "\n";
所以我有以下情况,下面的列表如何做
- 第一个星期一。
- 第二个星期六。
- 上周日。
我尝试了 this,但它不起作用。请帮我解决它。我想在存储过程中修复。我不想在 PHP.
这是一个可能的存储函数,可以满足您的需要。我假设“最后一个星期日”是指该月的最后一个星期日,因为您的其他 2 个是第一个和第二个。如果您指的是今天之前的星期日,例如 strtotime return,那么此代码将不会 return 正确的结果。您可以使用此代码作为进一步优化的起点。例如,您可能需要考虑许多行的性能。
DROP FUNCTION IF EXISTS strtotime;
DELIMITER $$
CREATE FUNCTION strtotime(timestring VARCHAR(255))
RETURNS DATE NOT DETERMINISTIC NO SQL
BEGIN
DECLARE retdate DATE;
DECLARE testdate DATE;
DECLARE instancenum INT;
DECLARE dayname CHAR(3);
CASE
WHEN timestring LIKE 'first%' THEN
SET instancenum = 1;
WHEN timestring LIKE 'second%' THEN
SET instancenum = 2;
WHEN timestring LIKE 'last%' THEN
SET instancenum = -1;
ELSE
SET instancenum = 0;
END CASE;
SET dayname = SUBSTRING(SUBSTRING_INDEX(timestring,' ',-1),1,3);
IF instancenum != 0 THEN
SET testdate = DATE_SUB(CURRENT_DATE,INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY);
IF instancenum < 0 THEN
SET testdate = DATE_SUB(DATE_ADD(testdate, INTERVAL 1 MONTH), INTERVAL 1 DAY);
END IF;
IF DATE_FORMAT(testdate,'%a') = dayname THEN
IF instancenum < 0 THEN
SET instancenum = instancenum + 1;
ELSE
SET instancenum = instancenum - 1;
END IF;
END IF;
WHILE DATE_FORMAT(testdate,'%a') != dayname OR instancenum!=0 DO
IF instancenum < 0 THEN
SET testdate = DATE_SUB(testdate,INTERVAL 1 DAY);
ELSE
SET testdate = DATE_ADD(testdate,INTERVAL 1 DAY);
END IF;
IF DATE_FORMAT(testdate,'%a') = dayname THEN
IF instancenum < 0 THEN
SET instancenum = instancenum + 1;
ELSE
SET instancenum = instancenum - 1;
END IF;
END IF;
END WHILE;
SET retdate = testdate;
ELSE
SET retdate = NULL;
END IF;
RETURN retdate;
END$$
DELIMITER ;
SELECT strtotime('first monday'),strtotime('second saturday'),strtotime('last sunday');
我正在尝试创建存储过程来获取一个月内的字符串,例如 PHP 中的 strotime,如下所示。 例如
echo strtotime("last Monday"), "\n";
所以我有以下情况,下面的列表如何做
- 第一个星期一。
- 第二个星期六。
- 上周日。
我尝试了 this,但它不起作用。请帮我解决它。我想在存储过程中修复。我不想在 PHP.
这是一个可能的存储函数,可以满足您的需要。我假设“最后一个星期日”是指该月的最后一个星期日,因为您的其他 2 个是第一个和第二个。如果您指的是今天之前的星期日,例如 strtotime return,那么此代码将不会 return 正确的结果。您可以使用此代码作为进一步优化的起点。例如,您可能需要考虑许多行的性能。
DROP FUNCTION IF EXISTS strtotime;
DELIMITER $$
CREATE FUNCTION strtotime(timestring VARCHAR(255))
RETURNS DATE NOT DETERMINISTIC NO SQL
BEGIN
DECLARE retdate DATE;
DECLARE testdate DATE;
DECLARE instancenum INT;
DECLARE dayname CHAR(3);
CASE
WHEN timestring LIKE 'first%' THEN
SET instancenum = 1;
WHEN timestring LIKE 'second%' THEN
SET instancenum = 2;
WHEN timestring LIKE 'last%' THEN
SET instancenum = -1;
ELSE
SET instancenum = 0;
END CASE;
SET dayname = SUBSTRING(SUBSTRING_INDEX(timestring,' ',-1),1,3);
IF instancenum != 0 THEN
SET testdate = DATE_SUB(CURRENT_DATE,INTERVAL DAYOFMONTH(CURRENT_DATE)-1 DAY);
IF instancenum < 0 THEN
SET testdate = DATE_SUB(DATE_ADD(testdate, INTERVAL 1 MONTH), INTERVAL 1 DAY);
END IF;
IF DATE_FORMAT(testdate,'%a') = dayname THEN
IF instancenum < 0 THEN
SET instancenum = instancenum + 1;
ELSE
SET instancenum = instancenum - 1;
END IF;
END IF;
WHILE DATE_FORMAT(testdate,'%a') != dayname OR instancenum!=0 DO
IF instancenum < 0 THEN
SET testdate = DATE_SUB(testdate,INTERVAL 1 DAY);
ELSE
SET testdate = DATE_ADD(testdate,INTERVAL 1 DAY);
END IF;
IF DATE_FORMAT(testdate,'%a') = dayname THEN
IF instancenum < 0 THEN
SET instancenum = instancenum + 1;
ELSE
SET instancenum = instancenum - 1;
END IF;
END IF;
END WHILE;
SET retdate = testdate;
ELSE
SET retdate = NULL;
END IF;
RETURN retdate;
END$$
DELIMITER ;
SELECT strtotime('first monday'),strtotime('second saturday'),strtotime('last sunday');