1. 使用 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'
2. 使用 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'
3. 使用 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日' (中文格式)
4. 字符串拼接(手动格式化)
使用日期函数提取各部分再拼接:
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'
5. 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版本、性能考虑和代码可读性。