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

Sql Server里那些常用的时间处理函数到底怎么用啊,搞不懂就看看这篇吧

根据网络技术博客和Microsoft SQL Server官方文档常见问题解答部分整理)

你是不是也觉得SQL Server里处理时间日期的时候特别头大?一会儿要算两个日期差多少天,一会儿又要提取年份月份,函数名字还长得差不多,用起来真是晕头转向,别急,这篇东西就是帮你把这些常用的时间处理函数捋清楚,咱们用大白话和例子来说明白。

第一部分:最基础,先搞清楚怎么拿到“这一刻

干任何事都得有个起点,处理时间也一样,SQL Server给你提供了好几个“的版本:

  1. GETDATE():这是最常用的老黄牛,它就是返回数据库服务器当前所在的日期和时间,精确到小数点后面3位(毫秒),比如你执行 SELECT GETDATE(),它可能返回 2023-10-27 15:30:45.123 这样的结果,你电脑的时间不准没关系,它看的是服务器的钟。

  2. SYSDATETIME():这个是GETDATE()的升级版,精度更高,能精确到小数点后面7位(100纳秒),如果你对时间精度要求特别高,比如要记录非常精确的操作时序,就用它,一般日常业务,GETDATE()足够了。

    Sql Server里那些常用的时间处理函数到底怎么用啊,搞不懂就看看这篇吧

  3. GETUTCDATE()SYSUTCDATETIME():这俩哥们儿返回的不是当地时间,而是“世界协调时间”(UTC),也就是格林威治标准时间,比如你的数据库服务器在北京(东八区),SELECT GETUTCDATE() 返回的时间会比 GETDATE() 慢8个小时,当你需要存储一个全球统一的时间标准时,它们就派上用场了。

第二部分:拆解时间,你想要哪部分就取哪部分

一个完整的日期时间像一个大礼包,有时候我们只需要里面的某一样东西,比如只要年份,或者只要小时数。

  1. YEAR(日期)MONTH(日期)DAY(日期):这三个函数最简单直接,你把一个日期值塞给它,它就把对应的年份、月份、日子中的日数单独抽出来给你。 SELECT YEAR('2023-10-27') 返回 2023SELECT MONTH('2023-10-27') 返回 10SELECT DAY('2023-10-27') 返回 27

    Sql Server里那些常用的时间处理函数到底怎么用啊,搞不懂就看看这篇吧

  2. DATEPART(部分参数, 日期):这是个“万能钥匙”,想要什么部分自己说,第一个参数告诉它你要什么,第二个参数是日期。 SELECT DATEPART(year, '2023-10-27 15:30:45') 返回 2023SELECT DATEPART(month, '2023-10-27 15:30:45') 返回 10SELECT DATEPART(day, '2023-10-27 15:30:45') 返回 27SELECT DATEPART(hour, '2023-10-27 15:30:45') 返回 15SELECT DATEPART(weekday, '2023-10-27') 返回星期几(默认周日是1,周一是2,以此类推)。 这个函数很强大,但记住参数要用英文字符串,year','hour','minute'等。

  3. DATENAME(部分参数, 日期):这个和DATEPART很像,但有时候返回的不是数字,而是名字,最常用的就是取星期几和月份的名字。 SELECT DATENAME(weekday, '2023-10-27') 可能会返回 'Friday'(根据数据库语言设置可能是中文‘星期五’)。 SELECT DATENAME(month, '2023-10-27') 可能会返回 'October'

第三部分:时间的计算,加减和差值

这是业务逻辑里最常用的部分了,比如计算会员还有几天到期,或者某个日期30天后是哪天。

Sql Server里那些常用的时间处理函数到底怎么用啊,搞不懂就看看这篇吧

  1. DATEADD(部分参数, 增量, 日期):给一个日期加上一段时间,三个参数分别是:要加的单位(比如天、月、年)、加多少、从哪个日期开始加。 SELECT DATEADD(day, 10, '2023-10-27') 就是在10月27号上加10天,返回 2023-11-06SELECT DATEADD(month, -2, '2023-10-27') 就是减去2个月,返回 2023-08-27SELECT DATEADD(hour, 5, '2023-10-27 10:00:00') 就是加5小时,返回 2023-10-27 15:00:00

  2. DATEDIFF(部分参数, 开始日期, 结束日期):计算两个日期之间相差多少个指定的时间单位,注意,它是计算“跨越”的边界数。 SELECT DATEDIFF(day, '2023-10-01', '2023-10-27') 相差26天,返回 26SELECT DATEDIFF(month, '2023-01-15', '2023-10-27') 虽然1月15到10月27日实际天数远超过9个月,但它只计算从1月到10月“跨越”了多少个“月”这个单位,结果是9。 SELECT DATEDIFF(year, '2022-12-31', '2023-01-01') 只差一天,但跨了一个“年”的边界,所以返回 1,这个特性在使用时要特别注意。

第四部分:格式转换,把日期变成你想要的字符串样子

数据库里存储的日期格式可能不是你最终展示给用户看的样子,这时候就需要转换。

  1. CONVERT(数据类型, 日期, 样式代码):这是最常用的格式化函数,样式代码是一个数字,代表不同的显示格式。 SELECT CONVERT(VARCHAR, GETDATE(), 23) 只显示日期部分,格式为 YYYY-MM-DD,如 2023-10-27SELECT CONVERT(VARCHAR, GETDATE(), 112) 也是日期,但格式是 YYYYMMDD,如 20231027SELECT CONVERT(VARCHAR, GETDATE(), 108) 只显示时间部分,格式为 HH:MI:SS,如 15:30:45SELECT CONVERT(VARCHAR, GETDATE(), 120) 是完整的日期时间,标准格式 YYYY-MM-DD HH:MI:SS,如 2023-10-27 15:30:45。 样式代码有很多,可以查一下常用的几个就行。

  2. FORMAT(日期, 格式字符串):这个函数更强大更直观,像C#里的格式化一样,你可以用自定义的格式字符串。 SELECT FORMAT(GETDATE(), 'yyyy-MM-dd') 结果同 2023-10-27SELECT FORMAT(GETDATE(), 'dd/MM/yyyy') 结果如 27/10/2023SELECT FORMAT(GETDATE(), 'dddd, MMMM dd, yyyy') 结果可能如 Friday, October 27, 2023。 这个函数用起来很灵活,但要注意性能,因为它比CONVERT要慢一些,如果处理大量数据要谨慎使用。

好了,以上就是SQL Server里最常用的一些时间日期处理函数,别看数量不少,其实分类后就清晰了:获取当前时间、拆解日期、计算日期、格式化输出,多在实际的SQL语句里用几次,配合具体的例子,很快就能上手了,下次再遇到时间处理的问题,翻出这篇来看看,对照着写,准没错。