我将日期作为逗号分隔值传递,例如。 param1 = 2012-01-12,2013-02-15,2012-12-01,这将输入到我的程序中,我如何才能获取作为参数传递给我的程序的所有日期的值。
我试过使用:select value from table1 where date_value in (param1);但它给了我一个空集。
请告诉我如何解决。
更新:
DELIMITER $$
CREATE FUNCTION test2(dates text)
RETURNS text READS SQL DATA
BEGIN
DECLARE abc text;
DECLARE hi text;
SET hi= concat('''',regex_replace('[,]',''',''',dates),'''');
select value into abc from table1 where date_time in (hi);
RETURN abc;
END;
$$
DELIMITER ;
我对该函数的输入将是多个日期:例如:2010-12-12,2012-12-10,.....
我的 regex_replace 函数将以这种格式返回日期:'2010-12-12','2012-12-10' 并将其设置为一个变量并传递给它。
但我总是得到一个空集。我哪里出错了?
最佳答案
您在示例中尝试做的是即时构建 SQL。这需要使用 prepared statement 来完成.但是,准备好的语句不能在函数中使用,如果有人可以操纵“日期”变量,它们也会带来安全风险。
相反,我建议拆分日期变量并将各部分插入到临时表中,然后对此进行查询。我在下面做了一个简单的例子:
DROP FUNCTION IF EXISTS checkCommaList;
DELIMITER #
CREATE FUNCTION checkCommaList(dates text)
RETURNS text
BEGIN
DECLARE abc text;
DROP TEMPORARY TABLE IF EXISTS checkCommaListTemp;
CREATE TEMPORARY TABLE checkCommaListTemp(textToSearch text);
WHILE (LOCATE(',',dates) > 0)
DO
SET @found = SUBSTRING(dates, 1, LOCATE(',', dates) - 1 );
SET dates = SUBSTRING(dates, LOCATE(',', dates) + 1);
INSERT INTO checkCommaListTemp VALUES (@found);
END WHILE;
SELECT `value` INTO abc FROM table1
WHERE date_time IN (SELECT * FROM checkCommaListTemp);
DROP TEMPORARY TABLE checkCommaListTemp ;
RETURN abc;
END;
#
DELIMITER ;
DROP TABLE IF EXISTS table1;
CREATE TABLE table1 (`value` text, date_time text);
INSERT INTO table1 (`value`, date_time) VALUES ('a', '2010-12-12');
SELECT checkCommaList('2010-12-12,2012-12-10');
但是,可能有更有效的方法来实现您想要的。
关于mysql - 在 Mysql 过程中传递多个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19560488/