使用SSMS创建SQL表时,如何存储dd-mm-yyyy等指定格式日期?
关于SQL Server日期存储格式的问题解答
核心结论:没法在建表时指定DATE类型的存储格式
SQL Server里的DATE/DATETIME等日期类型,本质是用内部数值(比如从基准日期开始的累计天数)存储日期逻辑值的,根本不存在“存储格式”一说。你在SSMS里看到的2022-06-01只是客户端默认的展示格式,和实际存储的内容完全无关。
具体说明和解决方案:
绝对不推荐把日期存成带格式的字符串
如果你强行把ORDERDATE改成VARCHAR(10)类型,插入时直接写'01-06-2022'或'01/06/2022',确实能存成你要的格式,但会彻底丢掉日期类型的所有优势:- 没法直接做日期加减、范围查询(比如查6月份的所有订单)
- 排序会按字符串规则乱序,比如
01-10-2022会排在02-06-2022前面 - 无法校验日期合法性,容易存入
32-13-2022这种无效值
这种做法完全不可取。
正确姿势:存储用DATE,展示时转换格式
继续用DATE类型存储日期,在需要展示的时候转换格式即可,你已经用到了正确的方法,再补充几种常用写法:- 转成
dd-mm-yyyy格式:SELECT CONVERT(VARCHAR(10), ORDERDATE, 103) AS ORDER_DATE FROM BILL - 转成
dd/mm/yyyy格式:-- 替换分隔符的方式(性能较好) SELECT REPLACE(CONVERT(VARCHAR(10), ORDERDATE, 103), '-', '/') AS ORDER_DATE FROM BILL -- 用FORMAT函数(语法更直观,但大数据量查询时性能不如CONVERT) SELECT FORMAT(ORDERDATE, 'dd/MM/yyyy') AS ORDER_DATE FROM BILL
- 转成
临时修改SSMS的默认显示格式(不影响存储)
如果你只是想在SSMS里默认看到dd-mm-yyyy格式,可以修改客户端设置:- 打开SSMS的「工具」->「选项」
- 找到「环境」->「国际设置」,将默认语言改为支持该格式的语言(比如英语(英国))
- 重启SSMS后,DATE类型列就会默认显示为对应格式
你的建表和插入语句说明
你的建表语句是最优写法,DATE类型完全符合需求。插入时用'20220601'这种无格式的日期字符串是SQL Server推荐的写法,能避免因语言/区域设置导致的日期解析错误。
内容的提问来源于stack exchange,提问作者bandaisme
相关产品推荐
相关产品推荐

