在Mysql上保存2月30日(日期格式化)

在Mysql上保存2月30日(日期格式化),mysql,types,crud,Mysql,Types,Crud,我在保存“连续日期”时遇到问题,因为这样每个月都有30天。我需要使用日期类型(不是varchar/text/blob/etc)来保存一个元素(2014-02-30),因为在这个项目中我们需要它。是否可能?可以使用sql\u模式而不是严格模式在日期或日期时间列中保存此类日期“值”: 允许\u无效的\u日期 不要对日期执行完全检查。只检查月份是否在 范围为1到12,日期范围为1到31。这 对于Web应用程序来说非常方便,您可以获得年、月、, 每天在三个不同的领域,你想储存什么 用户已插入(无日期验证

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

可以使用sql\u模式而不是严格模式在
日期
日期时间
列中保存此类日期“值”:

允许\u无效的\u日期

不要对日期执行完全检查。只检查月份是否在 范围为1到12,日期范围为1到31。这 对于Web应用程序来说非常方便,您可以获得年、月、, 每天在三个不同的领域,你想储存什么 用户已插入(无日期验证)。此模式适用于日期 和日期时间列。它不应用时间戳列,因为 始终需要有效的日期

因此,检查允许的可连续日期可以通过触发器完成,因为没有其他检查。我假设对于本申请,每月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

使用MySQL工作台

SELECT contable_date FROM example
结果如下:

contable_date
-------------
   2014-02-30
但这在sqlfiddle.com上不起作用


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

将它保存为日期,并在选择它时对其进行格式化。我不这么认为。您可能需要将其存储为一个数字。我同意@johncode,为了最大限度地利用DBMS,保存日期并将其转换为在应用程序中使用。@johncode在我所知道的任何DBMS中,都不可能将
2014-02-30
插入日期时间字段。今年2月的最后一天是28日。看看sql_模式。然后可以将这样的值存储在
DATE
DATETIME
列中,并将该值恢复为已存储的值。我可以使用该值在同一sql中保存日期并再次取消设置此选项吗?,如设置ALLOW\u INVALID\u DATES=1;'Mysql查询';设置允许\无效\日期=0;您可以这样做,选择仍然有效,请参见。即使是由订购的也会将2月30日提前到3月1日。