CONVERT() 函数这是最常用的方法,可以指定格式化样式:
-- 转换为默认格式
SELECT CONVERT(VARCHAR, GETDATE()) -- 默认格式: 'MM dd yyyy hh:mmAM'
-- 指定格式化样式(常用样式)
SELECT CONVERT(VARCHAR, GETDATE(), 120) -- 'yyyy-mm-dd hh:mi:ss' (24h)
SELECT CONVERT(VARCHAR, GETDATE(), 121) -- 'yyyy-mm-dd hh:mi:ss.mmm'
SELECT CONVERT(VARCHAR, GETDATE(), 112) -- 'yyyymmdd' (紧凑格式)
SELECT CONVERT(VARCHAR, GETDATE(), 111) -- 'yyyy/mm/dd'
SELECT CONVERT(VARCHAR, GETDATE(), 101) -- 'mm/dd/yyyy'
SELECT CONVERT(VARCHAR, GETDATE(), 103) -- 'dd/mm/yyyy'
SELECT CONVERT(VARCHAR, GETDATE(), 104) -- 'dd.mm.yyyy'
CAST() 函数将日期隐式转换为字符串:
-- 隐式转换,转换为默认格式
SELECT CAST(GETDATE() AS VARCHAR)
-- 指定长度
SELECT CAST(GETDATE() AS VARCHAR(10)) -- 'MM dd yyyy'
SELECT CAST(GETDATE() AS VARCHAR(20)) -- 'MM dd yyyy hh:mmAM'
FORMAT() 函数(SQL Server 2012+)提供最灵活的格式化选项:
-- 自定义格式化
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') -- '2024-01-15 14:30:25'
SELECT FORMAT(GETDATE(), 'yyyy/MM/dd') -- '2024/01/15'
SELECT FORMAT(GETDATE(), 'dd/MM/yyyy') -- '15/01/2024'
SELECT FORMAT(GETDATE(), 'MMM dd, yyyy') -- 'Jan 15, 2024'
SELECT FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy') -- 'Monday, January 15, 2024'
-- 包含毫秒
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss.fff') -- '2024-01-15 14:30:25.123'
-- 区域设置格式化
SELECT FORMAT(GETDATE(), 'd', 'en-US') -- '1/15/2024' (美国格式)
SELECT FORMAT(GETDATE(), 'd', 'de-DE') -- '15.01.2024' (德国格式)
SELECT FORMAT(GETDATE(), 'D', 'zh-CN') -- '2024年1月15日' (中文格式)
使用日期函数提取各部分再拼接:
SELECT
CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-' +
RIGHT('0' + CAST(MONTH(GETDATE()) AS VARCHAR(2)), 2) + '-' +
RIGHT('0' + CAST(DAY(GETDATE()) AS VARCHAR(2)), 2) AS DateString
-- 结果: '2024-01-15'
DATENAME() 和 DATEPART() 组合获取特定日期部分进行格式化:
SELECT
DATENAME(YEAR, GETDATE()) + '-' +
RIGHT('0' + DATENAME(MONTH, GETDATE()), 2) + '-' +
RIGHT('0' + DATENAME(DAY, GETDATE()), 2)
| 代码 | 格式 | 示例 |
|---|---|---|
| 0/100 | 默认 | 'Jan 15 2024 2:30PM' |
| 101 | 美国 | '01/15/2024' |
| 102 | ANSI | '2024.01.15' |
| 103 | 英国/法国 | '15/01/2024' |
| 104 | 德国 | '15.01.2024' |
| 105 | 意大利 | '15-01-2024' |
| 106 | - | '15 Jan 2024' |
| 107 | - | 'Jan 15, 2024' |
| 108 | - | '14:30:00' |
| 110 | 美国 | '01-15-2024' |
| 111 | 日本 | '2024/01/15' |
| 112 | ISO | '20240115' |
| 113/13 | 欧洲默认 | '15 Jan 2024 14:30:00:000' |
| 120/20 | ODBC规范 | '2024-01-15 14:30:00' |
| 121/25 | ODBC规范(带毫秒) | '2024-01-15 14:30:00.000' |
CONVERT() 比 FORMAT() 更快 - FORMAT() 功能强大但性能开销较大
生产环境考虑性能时,优先使用 CONVERT()
需要复杂国际化时,使用 FORMAT()
日期范围查询时,不要在列上使用转换函数,会阻止索引使用
-- 获取当前日期时间并格式化
DECLARE @Date DATETIME = GETDATE()
SELECT
@Date AS OriginalDate,
CONVERT(VARCHAR, @Date, 120) AS Convert120, -- 推荐用于通用格式
FORMAT(@Date, 'yyyy-MM-dd HH:mm:ss') AS FormatCustom,
CONVERT(VARCHAR(8), @Date, 112) AS Convert112, -- 仅日期紧凑格式
CAST(@Date AS VARCHAR(23)) AS CastDefault
选择哪种方法取决于具体需求:格式要求、SQL Server版本、性能考虑和代码可读性。