用零存储日期(无效的日期时间格式)
Posted
技术标签:
【中文标题】用零存储日期(无效的日期时间格式)【英文标题】:Storing dates with zeroes (Invalid datetime format) 【发布时间】:2021-12-04 11:59:25 【问题描述】:我在 mysql 文档中读到,如果我不知道月份或日期,我可以使用 00
存储生日,这正是我需要的,但这仅对旧 MySQL 版本或某些选项有效开启了吗?
MySQL 允许您将日期存储在日期或月份和日期所在的位置 DATE 或 DATETIME 列中的零。这对应用程序很有用 需要存储您可能不知道确切日期的生日 日期。在这种情况下,您只需将日期存储为“2009-00-00”或 '2009-01-00'。
来源:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html
我在运行播种机时得到这个。
SQLSTATE[22007]:日期时间格式无效:1292 日期值不正确: 第 1 行的“birth_date”列的“1806-00-00”
还有其他解决这个问题的建议吗?
【问题讨论】:
也许这并不理想,但您可以将日期分成 3 个字段,例如年、月、日,并使它们可以为空。缺点是您需要在需要进行任何日期操作时转换为日期 这就是我最终所做的,但如果月份和日期为空,则使用第四个索引日期字段获取“YYYY-01-01”。 我建议将day
/month
/year
存储为单独的列,并使月/日可以为空。
@meagar 谢谢!什么列类型?
【参考方案1】:
想想整数。您将如何存储“20 到 30 之间的某个整数”之类的值?
您可以存储数字 20,并编写假定该值可能在值 N 和 N+10 的范围内的应用程序代码。 您可以存储数字 2,但要知道这实际上是 N 除以 10 的值。 您可以存储字符串值而不是使用 INTEGER 数据类型。您将存储一个字面上为“20-30”的字符串。 您可以存储两个值,一个 20,另一个 30,即范围的下限和上限。 还有别的吗?关键是没有办法在单个标量整数值中表示整数范围。
如果您需要存储不精确的日期,例如没有特定日期的年月,您可能无法使用 DATE、DATETIME 或 TIMESTAMP 数据类型的单列。这些数据类型用于特定值,而不是范围。
您可以存储一个整数,即 YYYYMM,或者您可以存储作为该月的第一个日期的日期,或者作为范围的上下两端的两个日期,或者您可以存储年、月、 day 作为单独的列,或其他一些解决方案。这些解决方案中的任何一个都需要您编写应用程序代码来以特殊方式处理它们。您不能只以默认方式使用 DATE 数据类型。
MySQL 历史上允许在日期组件中使用零,但这会导致无意义的值。您如何使用像 2021-10-00 这样的日期值进行日期算术?那是2021-10-01前一天吗?也是2021-09-30之后的一天吗?日期怎么可能在这两个真实日期之间?你明白了。
【讨论】:
【参考方案2】:在连接到 MySQL 后立即发出此 SQL 语句,每次连接时。
SET @@sql_mode := REPLACE(@@sql_mode, 'NO_ZERO_IN_DATE', '');
这将关闭您的连接的NO_ZERO_IN_DATE mode,让您按照您的要求去做。
【讨论】:
谢谢!我刚读到这个,所以也许我应该尝试找到不同的解决方案?NO_ZERO_IN_DATE is deprecated. NO_ZERO_IN_DATE is not part of strict mode, but should be used in conjunction with strict mode and is enabled by default. A warning occurs if NO_ZERO_IN_DATE is enabled without also enabling strict mode or vice versa. Because NO_ZERO_IN_DATE is deprecated, you should expect it to be removed in a future MySQL release as a separate mode name and its effect included in the effects of strict SQL mode.
该功能已被弃用很长时间。如果您希望您的应用程序能够存活十年或更长时间,是的,您可能希望以其他方式做到这一点。以上是关于用零存储日期(无效的日期时间格式)的主要内容,如果未能解决你的问题,请参考以下文章
Oracle/SQL:将日期和时间连接成单个日期值时的数字格式模型无效
MAX日期的Laravel子查询-与父级的子查询链接中的日期时间格式无效