如何在SQL中插入点分隔格式的日期?插入31.12.2021失败的解决方法
如何在SQL中插入点分隔格式的日期(如31.12.2021)
嘿,这个问题我碰到过好多次了——SQL数据库大多默认认标准ISO日期格式(比如YYYY-MM-DD),直接塞点分隔的字符串肯定会报错,因为它搞不清你那串数字哪个是日哪个是月。下面给你具体的解决语句,还有通用的正确思路:
针对主流数据库的插入示例
MySQL/MariaDB
用STR_TO_DATE()函数把点分隔的字符串转换成数据库能识别的日期类型:
INSERT INTO your_table (date_column) VALUES (STR_TO_DATE('31.12.2021', '%d.%m.%Y'));
这里的%d代表两位数字的日期,%m是两位月份,%Y是四位年份,完美匹配你日.月.年的格式。如果转换失败(比如输入了32.12.2021这种无效日期),函数会返回NULL,插入时如果字段不允许为NULL才会报错。
PostgreSQL
使用TO_DATE()函数做转换:
INSERT INTO your_table (date_column) VALUES (TO_DATE('31.12.2021', 'DD.MM.YYYY'));
格式符DD对应两位日,MM对应两位月,YYYY对应四位年。如果是PostgreSQL 12及以上版本,还可以用TRY_TO_DATE(),转换失败时返回NULL而不是直接抛出错误,更安全。
SQL Server
用CONVERT()或者更安全的TRY_CONVERT()函数:
-- 基础转换,如果格式错误会直接报错 INSERT INTO your_table (date_column) VALUES (CONVERT(DATE, '31.12.2021', 104)); -- 推荐:TRY_CONVERT转换失败时返回NULL,不会中断整个插入操作 INSERT INTO your_table (date_column) VALUES (TRY_CONVERT(DATE, '31.12.2021', 104));
这里的104是SQL Server内置的样式代码,专门对应dd.mm.yyyy格式的日期字符串。
插入点分隔日期的通用正确方法
不管用哪种数据库,核心原则都是:不要直接插入日期字符串,先把字符串转换为数据库原生的日期/日期时间类型。具体步骤可以参考:
- 确认你的数据库支持的日期转换函数(比如Oracle可以用
TO_DATE('31.12.2021', 'DD.MM.YYYY'),逻辑和PostgreSQL一致)。 - 匹配格式符:根据你的日期字符串结构(比如是
日.月.年还是月.日.年),选择对应的格式符号,一定要和字符串的每一段对应上,不然会转换错误。 - 优先使用安全转换函数:比如SQL Server的
TRY_CONVERT、PostgreSQL的TRY_TO_DATE,避免因为个别无效日期(比如30.02.2021)导致整个插入操作失败。 - 额外小技巧:如果你的应用程序可以控制输入,最好在插入前就把日期转换成
YYYY-MM-DD的ISO标准格式,这种格式几乎所有数据库都能直接识别,不用写转换函数,兼容性拉满。
内容的提问来源于stack exchange,提问作者TL308




