当前位置:首页 > 问答 > 正文

SQL Server里convert函数怎么用来格式化时间那点事儿和代码示例分享

在SQL Server里,处理日期和时间显示格式时,CONVERT函数是一个非常常用的工具,它不像一些编程语言里有非常灵活的格式化字符串,SQL Server用的是预先定义好的一些“风格代码”来指定输出格式,这个知识点主要就是记住这些代码和它们对应的样子。

CONVERT函数的基本用法

CONVERT函数的基本语法是这样的: CONVERT(data_type, expression [, style])

  • data_type: 你想转换成的数据类型,对于格式化时间,这里通常填 VARCHARNVARCHAR,因为目的是为了变成字符串显示。
  • expression: 要转换的值,这里就是你的日期时间字段或者变量,GETDATE()
  • style: 这是最关键的部分,一个整数代码,决定了转换后的字符串格式,这个参数是可选的,如果不写,CONVERT会尝试进行默认的转换。

常用的风格代码和示例

下面我们直接用 GETDATE() 函数(它返回当前系统日期和时间)来演示最常见的几种样式,假设当前时间是“2023年10月27日下午3点09分08秒”。

  1. 最普通的格式(style 0-9, 100-109) 这一组样式主要区别在于年月日的顺序、分隔符和是否包含世纪。

    • Style 101: 美国标准,月/日/年,这是很清晰的一种格式。 SELECT CONVERT(VARCHAR, GETDATE(), 101) AS ‘格式化时间’ 结果会是:10/27/2023

      SQL Server里convert函数怎么用来格式化时间那点事儿和代码示例分享

    • Style 102: ANSI标准,年.月.日,这种格式排序起来很方便。 SELECT CONVERT(VARCHAR, GETDATE(), 102) AS ‘格式化时间’ 结果会是:10.27

    • Style 103: 英国/法国标准,日/月/年。 SELECT CONVERT(VARCHAR, GETDATE(), 103) AS ‘格式化时间’ 结果会是:27/10/2023

    • Style 120: ODBC规范格式,非常标准,长得像 YYYY-MM-DD HH:MI:SS,这在和其他系统对接时常用。 SELECT CONVERT(VARCHAR, GETDATE(), 120) AS ‘格式化时间’ 结果会是:2023-10-27 15:09:08

    • Style 121: ODBC规范格式(带毫秒),是120的扩展。 SELECT CONVERT(VARCHAR, GETDATE(), 121) AS ‘格式化时间’ 结果会是:2023-10-27 15:09:08.123 (这里的毫秒数是随机的)

    你会发现,100以下的代码(如1,2,3…)对应的是两位数的年份(YY),而100以上的代码(如101,102,103…)对应的是四位数的年份(YYYY),所以现在基本都用100以上的代码,避免千年虫问题。

    SQL Server里convert函数怎么用来格式化时间那点事儿和代码示例分享

  2. 只获取日期部分(不包含时间) 有时候你只关心日期,不想要后面的时间,虽然可以用Style 101102,但更精确的方法是使用Style 112

    • Style 112: ISO标准,纯数字格式YYYYMMDD,这不仅是显示格式,也是排序和比较的理想格式。 SELECT CONVERT(VARCHAR, GETDATE(), 112) AS ‘纯日期’ 结果会是:20231027

    如果你想得到带分隔符的纯日期,比如2023-10-27,用Style 23也可以。 SELECT CONVERT(VARCHAR, GETDATE(), 23) AS ‘纯日期’ 结果会是:2023-10-27

  3. 只获取时间部分(不包含日期) 同样,有时候只需要时间。

    • Style 108: 标准时间格式HH:MI:SSSELECT CONVERT(VARCHAR, GETDATE(), 108) AS ‘纯时间’ 结果会是:15:09:08

    • Style 114: 带毫秒的时间格式。 SELECT CONVERT(VARCHAR, GETDATE(), 114) AS ‘纯时间带毫秒’ 结果会是:15:09:08.123

      SQL Server里convert函数怎么用来格式化时间那点事儿和代码示例分享

  4. 中文环境下常用的格式 我们中国人习惯说“年月日”。

    • Style 111: 格式是YYYY/MM/DD,虽然不是纯中文,但读起来很符合习惯。 SELECT CONVERT(VARCHAR, GETDATE(), 111) AS ‘格式化时间’ 结果会是:2023/10/27

    • 如果想得到YYYY年MM月DD日这种格式,CONVERT函数的内置样式是做不到的,这就需要更强大的FORMAT函数(SQL Server 2012及以上版本支持)了,不过我们今天主要讲CONVERT。

一个实用的查询:查看所有样式

你可以运行下面这个简单的查询,一次性看到同一个时间点用不同样式转换出来的所有结果,这对于学习和查找需要的格式非常方便。

DECLARE @Now DATETIME = GETDATE()
SELECT
    style_id = 100,
    style_format = ‘默认’,
    result = CONVERT(VARCHAR, @Now, 100)
UNION ALL
SELECT 101, ‘美国 mm/dd/yyyy’, CONVERT(VARCHAR, @Now, 101)
UNION ALL
SELECT 102, ‘ANSI yy.mm.dd’, CONVERT(VARCHAR, @Now, 102)
UNION ALL
SELECT 103, ‘英法 dd/mm/yyyy’, CONVERT(VARCHAR, @Now, 103)
UNION ALL
SELECT 108, ‘时间 hh:mi:ss’, CONVERT(VARCHAR, @Now, 108)
UNION ALL
SELECT 111, ‘日本 yyyy/mm/dd’, CONVERT(VARCHAR, @Now, 111)
UNION ALL
SELECT 112, ‘ISO yyyymmdd’, CONVERT(VARCHAR, @Now, 112)
UNION ALL
SELECT 120, ‘ODBC yyyy-mm-dd hh:mi:ss’, CONVERT(VARCHAR, @Now, 120)
UNION ALL
SELECT 121, ‘ODBC(含毫秒)’, CONVERT(VARCHAR, @Now, 121)
ORDER BY style_id

总结一下

CONVERT函数格式化时间的关键就是背下那些常用的“风格代码”,它用起来简单直接,性能也很好,对于大多数“年月日时分秒”的常规显示需求,CONVERT都能胜任,它的缺点是不够灵活,格式是固定的,如果你需要像“2023年10月27日”这样非常特定的格式,那就得求助更新的FORMAT函数了,但FORMAT的性能开销比CONVERT大很多,在处理大量数据时要谨慎使用。

掌握好CONVERT函数的这些样式代码,是高效使用SQL Server进行日期显示处理的基本功,希望这些直接的例子对你有帮助。