我在保存"可控制日期"时遇到问题,因为这样每个月都有30天。我需要保存一个元素(2014-02-30),使用类似日期的类型(而不是varchar/text/blob/etc)来保存它,因为在这个项目中我们需要它。有可能吗?
使用sql_mode ALLOW_INVALID_DATES和非严格模式可以在DATE
或DATETIME
列中保存这样的DATE"值":
ALLOW_INVALID_DATES
不要对日期进行全面检查。只检查月份是否在从1到12的范围内,并且天在从1到31的范围内。这对于Web应用程序来说非常方便,和day在三个不同的字段中,并且您想要准确地存储用户插入(没有日期验证)。此模式适用于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
演示
使用MySQL Workbench我获得
SELECT contable_date FROM example
以下结果:
contable_date
-------------
2014-02-30
但这在sqlfiddle.com上不起作用。
不过我不建议这样做,尤其是因为不能使用严格的SQL模式。还应考虑对日期和时间函数的影响。