在Mysql上保存30-Feb(日期格式)

时间:2014-09-16 19:48:55

标签: mysql types crud

我有一个问题,即保存日期'因为这样每个月都有30天。我需要使用类型日期(不是varchar / text / blob / etc)保存元素(2014-02-30)来保存它,因为在这个项目中我们需要它。有可能吗?

1 个答案:

答案 0 :(得分:2)

使用sql_mode ALLOW_INVALID_DATES并且没有严格模式,可以在DATEDATETIME列中保存这样的DATE“值”:

  

ALLOW_INVALID_DATES

     

不要对日期进行全面检查。只检查月份是否在   范围从1到12,日期在1到31之间   对于获得年,月的Web应用程序非常方便   和三天在三个不同的领域,你想要存储什么   用户插入(没有日期验证)。此模式适用于DATE   和DATETIME列。它不适用TIMESTAMP列   总是要求有效的日期。

因此,可以使用触发器检查允许的可能日期的日期,因为也没有其他检查。我假设对于这个应用程序,每个月的第31个将是无效的日期。

示例:

CREATE TABLE example (
  contable_date DATE NOT NULL
) ENGINE=INNODB;

-- set the sql_mode (here for the session)
SET @@SESSION.sql_mode = 'ALLOW_INVALID_DATES';

INSERT INTO example (contable_date) VALUES ("2014-02-30");

SELECT 
    DAY(contable_date) as cday,
    MONTH(contable_date) as cmonth,
    TIMESTAMPDIFF(DAY, contable_date, '2014-03-30') as cdiff
FROM 
    example;

结果:

cday  cmonth  cdiff
-------------------
  30       2     28

Demo

使用MySQL Workbench我得到了

SELECT contable_date FROM example

以下结果:

contable_date
-------------
   2014-02-30

但这在sqlfiddle.com上不起作用。

我不建议这样做,特别是因为一个人无法使用严格的SQL模式。人们应该考虑对日期和时间函数的影响。