我要做的是设置时间间隔的开始,如果没有正确设置到存储过程中。然而,它在某种程度上不能很好地工作..
这是我的代码:
CREATE PROCEDURE intervals_generator (IN start DATETIME, IN ending DATETIME, IN intervalis INT)
BEGIN
-- temp values
DECLARE next_date DATETIME;
-- result temp values
DECLARE start_temp DATETIME;
DECLARE ending_temp DATETIME;
-- date formatting variables
DECLARE year CHAR(20);
DECLARE month CHAR(20);
DECLARE day CHAR(20);
DECLARE new_start CHAR(20);
-- SET starting date if is incorrect DATE_FORMAT(NOW(), '%d %m %Y')
SET year := DATE_FORMAT(start, '%Y');
SET month := DATE_FORMAT(start, '%c');
SET day := DATE_FORMAT(start, '%e');
IF intervalis = '1_day' THEN
BEGIN
SET new_start := year+' '+month+' '+day+' 00:00:00';
END;
ELSEIF intervalis = '1_month' THEN
BEGIN
SET new_start := year+' '+month+' 1 00:00:00';
END;
ELSEIF intervalis = '1_quarter' THEN
BEGIN
IF MONTH(start) IN (2, 3) THEN
SET month := 1;
ELSEIF MONTH(start) IN (5, 6) THEN
SET month := 4;
ELSEIF MONTH(start) IN (8, 9) THEN
SET month := 7;
ELSEIF MONTH(start) IN (11, 12) THEN
SET month := 10;
END IF;
SET new_start := year+' '+month+' 1 00:00:00';
END;
ELSEIF intervalis = '1_year' THEN
BEGIN
SET new_start := year+' 1 1 00:00:00';
END;
END IF;
SET start := STR_TO_DATE(new_start, '%Y %c %e %h:%i:%s');
SELECT year, month, day, start;
DROP TEMPORARY TABLE IF EXISTS intervals_result;
END//
DELIMITER ;
我尝试了很多不同的格式设置和功能,但输出仍然是错误的,如下所示:
mysql> CALL intervals_generator('2013-02-01 00:00:00', '2015-12-31 00:00:00', '1_year');
+------+-------+------+---------------------+
| year | month | day | start |
+------+-------+------+---------------------+
| 2013 | 2 | 1 | 2016-00-00 00:00:00 |
+------+-------+------+---------------------+
1 row in set (0.02 sec)
Query OK, 0 rows affected, 1 warning (0.02 sec)
我真的不明白为什么输出是“2016-00-00”而不是“2013-01-01”。年,月和日变量定义为CHAR,并且从datetime中提取它们的函数应该返回CHAR。功能STR_TO_DATE也应该采用CHAR格式,所以对我来说这是一个谜。
如果有人有任何想法,请给我提示。
答案 0 :(得分:1)
如果您使用DATE
s而不是字符串,您可以使用MySQL的日期functions and operators并使一切变得更简单......但不要太简单,因为这是MySQL。
MySQL和日期的问题是它的日期功能是一个真正的混搭,有时可以使用DATE
,有时使用字符串,有时使用整数,并且缺少基本功能。它缺少设置日期的简单功能;没有功能可以将MONTH
的{{1}}部分更改为2月。从年,月,日开始制作日期甚至没有好方法,最接近的是MAKEDATE()
,需要一年和一年的一天(?!)。 Fortunately, DATE
s in MySQL respond to math operations并且它比乱用字符串更好。
例如,如果您有DATE
并希望2013-02-12
,则必须首先使用MAKEDATE
创建一年中的新日期,然后添加月份部分。
2013-02-01
在删除所有未使用的变量,更改为日期数学,并使用CASE statement而不是大IF / ELSE链后,我们得到:
-- 2013-01-01
SET new_date := MAKEDATE(YEAR(old_date), 1);
-- 2013-02-01
-- Since MONTH returns from 1 to 12, you need to take away one.
SET new_date := new_date + (INTERVAL MONTH(old_date) - 1) MONTH;
答案 1 :(得分:1)
这句话没有达到预期效果:
SET new_start := year+' '+month+' '+day+' 00:00:00';
在MySQL中,+
运算符会添加。就是这样,而不是连接。
我想你打算:
SET new_start := concat(year, ' ', month, ' ', day, ' 00:00:00');
我没有看过其余的逻辑,看它是否有意义,但这是一个明显的问题。
答案 2 :(得分:1)