在MySQL中更改日期时间值

时间:2015-09-26 20:04:31

标签: mysql sql datetime

我要做的是设置时间间隔的开始,如果没有正确设置到存储过程中。然而,它在某种程度上不能很好地工作..

这是我的代码:

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格式,所以对我来说这是一个谜。

如果有人有任何想法,请给我提示。

3 个答案:

答案 0 :(得分:1)

如果您使用DATEs而不是字符串,您可以使用MySQL的日期functions and operators并使一切变得更简单......但不要太简单,因为这是MySQL。

MySQL和日期的问题是它的日期功能是一个真正的混搭,有时可以使用DATE,有时使用字符串,有时使用整数,并且缺少基本功能。它缺少设置日期的简单功能;没有功能可以将MONTH的{​​{1}}部分更改为2月。从年,月,日开始制作日期甚至没有好方法,最接近的是MAKEDATE(),需要一年和一年的一天(?!)。 Fortunately, DATEs 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;

Try it out.

答案 1 :(得分:1)

这句话没有达到预期效果:

SET new_start := year+' '+month+' '+day+' 00:00:00';

在MySQL中,+运算符会添加。就是这样,而不是连接。

我想你打算:

SET new_start := concat(year, ' ', month, ' ', day, ' 00:00:00');

我没有看过其余的逻辑,看它是否有意义,但这是一个明显的问题。

答案 2 :(得分:1)

您可以使用内置DATE_FORMAT

而不是从容易出错的部分(连接)切片和构建新日期

<强> SqlFiddleDemo

{{1}}

<强> SqlFiddleDemo2

{{1}}