我有一个问题,即保存日期'因为这样每个月都有30天。我需要使用类型日期(不是varchar / text / blob / etc)保存元素(2014-02-30)来保存它,因为在这个项目中我们需要它。有可能吗?
答案 0 :(得分:2)
使用sql_mode ALLOW_INVALID_DATES并且没有严格模式,可以在DATE
或DATETIME
列中保存这样的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
使用MySQL Workbench我得到了
SELECT contable_date FROM example
以下结果:
contable_date
-------------
2014-02-30
但这在sqlfiddle.com上不起作用。
我不建议这样做,特别是因为一个人无法使用严格的SQL模式。人们应该考虑对日期和时间函数的影响。