SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你
- 问答
- 2025-12-27 21:28:15
- 3
SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你
你是不是也觉得SQL里的时间函数特别让人头疼?什么DATEADD、DATEDIFF、DATEPART,名字长得差不多,用起来却老是搞混,别担心,你不是一个人!处理日期和时间几乎是每个用SQL的人都会遇到的坎儿,今天我们就用最直白的大白话,把这些函数掰开揉碎了讲清楚,让你以后再也不怕它们。
你得知道你数据库里的“日历”长啥样
在深入聊函数之前,有个关键点必须明白:你的数据库把时间数据存在什么“形状”里,最常见的就是像 2023-10-27 这样的DATE类型,或者更详细的 2023-10-27 15:30:45 这样的DATETIME或TIMESTAMP类型,你可以把它们想象成一个完整的日期和时间戳,所有的函数,基本都是围绕这些“时间戳”来进行“截取”、“加减”和“比较”的。
第一类函数:从时间戳里“拆零件”
很多时候,我们不需要完整的时间,只关心其中的一部分,老板让你“统计每个月的销售额”,那你需要从订单日期里把“月份”单独抽出来。

-
YEAR(),MONTH(),DAY():最简单直接的“拆卸工具” 这三个函数最好理解,它们的作用就是从一个大大的日期里,分别把年、月、日这三个数字拿出来。- 例子:
SELECT MONTH('2023-10-27')这个查询会返回一个数字10,因为它从“2023年10月27日”这个日期里,把“月”这个部分拆出来了。 - 实战场景:
SELECT MONTH(订单日期), SUM(销售额) FROM 订单表 GROUP BY MONTH(订单日期),这句SQL的意思就是,先从每条记录的“订单日期”里提取出月份,然后按照月份分组,计算每个月的总销售额,看,是不是很实用?
- 例子:
-
DATEPART():一个更强大的“万能瑞士军刀” 这个函数功能更强,想拆什么零件,告诉它一声就行,它需要两个参数:第一个参数是你想要的时间部分(比如年、月、日、星期几、一年中的第几天等),第二个参数是那个完整的时间戳。- 例子:
SELECT DATEPART(WEEK, '2023-10-27')会返回这一天是2023年的第几周。SELECT DATEPART(HOUR, '2023-10-27 15:30:45')会返回小时数15。
- 小提示:不同数据库的叫法可能略有差异,比如在MySQL里,更常用的类似功能是
YEAR()、MONTH(),或者用EXTRACT(YEAR FROM 日期字段)。
- 例子:
第二类函数:给时间做“加减法”
另一个常见需求是计算一段时间间隔。“找出所有30天前注册的用户”或者“计算订单的预计送达日期(下单日期+3天)”。

-
DATEADD():给某个日期加上一段时间 这个函数需要三个参数:第一部分指明要加的单位(是加几天还是加几个月?),第二部分指明加多少,第三部分指明从哪个日期开始加。- 例子:
SELECT DATEADD(DAY, 7, '2023-10-27')会返回2023-11-03,意思是在2023年10月27日的基础上,加上7天。 - 实战场景:
SELECT 用户ID, 注册时间 FROM 用户表 WHERE 注册时间 > DATEADD(DAY, -30, GETDATE()),这里用了一个小技巧,GETDATE()(或NOW())是获取当前时间的函数。DATEADD(DAY, -30, GETDATE())就相当于“当前时间往前推30天”,整个查询的意思就是“查找过去30天内注册的所有用户”。
- 例子:
-
DATEDIFF():计算两个日期之间相差多少 这个函数用来比较两个日期,看它们之间隔了多久,它也需要三个参数:第一部分指明计算差值的单位(是天数差还是月数差?),后面两个参数就是你要比较的两个日期。- 例子:
SELECT DATEDIFF(DAY, '2023-10-20', '2023-10-27')会返回7,意思是10月20日和10月27日之间相差7天。 - 实战场景:
SELECT 订单ID, DATEDIFF(DAY, 下单时间, 发货时间) AS 发货用时 FROM 订单表,这句SQL可以计算出每个订单从下单到发货实际用了多少天,非常便于分析物流效率。
- 例子:
第三类函数:格式化输出,让时间“变好看”
直接从数据库里拿出来的时间格式可能不符合你的要求,比如你只想显示“2023年10月27日”这样中文的格式,这时候就需要格式化函数。

CONVERT()或FORMAT():给时间换件“衣服” 这个函数在不同数据库中差异最大,但目的都一样:改变时间的显示格式。- 在SQL Server中常用
CONVERT:SELECT CONVERT(VARCHAR, GETDATE(), 23)会把当前日期转换成2023-10-27这样的格式,那个数字23代表了一种预定义的格式风格。 - 在MySQL中常用
DATE_FORMAT:SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日')会返回2023年10月27日,这里的%Y、%m等都是格式符。 - 注意:这个功能虽然好用,但有时会影响查询性能,尤其是在数据量大的时候,所以要谨慎使用。
- 在SQL Server中常用
最重要的实战技巧:组合使用!
真正的威力在于把这些函数像乐高积木一样组合起来,举个例子,你想找出每个季度最后一天下的所有订单。
思路可能是这样的:
- 用
YEAR(订单日期)取出年份。 - 用
MONTH(订单日期)取出月份。 - 判断月份是否是3、6、9、12(季末月)。
- 再结合
DAY(订单日期)判断是否是当月的最后一天(这个判断稍微复杂点,可能需要用DATEADD计算下个月第一天再减一天)。
虽然这个例子有点复杂,但它展示了如何将多个时间函数串联起来解决一个具体问题。
总结一下
别被这些函数的名字吓到,它们无非就是帮你做三件事:
- 拆:从完整时间戳里提取你需要的部分(年、月、日、小时……)。
- 算:对时间进行加减,或者计算两个时间的间隔。
- 改:改变时间的显示格式,让它更易读。
最好的学习方法就是打开你的数据库管理工具,找一个有日期字段的表,把上面的例子一个一个敲进去试试看,稍微改改参数,看看结果有什么变化,动手练上半小时,绝对比你干巴巴地看文章要管用得多,相信我,一旦你理解了它们的逻辑,这些时间函数就会从“拦路虎”变成你的“得力助手”!
本文由寇乐童于2025-12-27发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/69640.html
