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

SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你

SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你

你是不是也觉得SQL里的时间函数特别让人头疼?什么DATEADD、DATEDIFF、DATEPART,名字长得差不多,用起来却老是搞混,别担心,你不是一个人!处理日期和时间几乎是每个用SQL的人都会遇到的坎儿,今天我们就用最直白的大白话,把这些函数掰开揉碎了讲清楚,让你以后再也不怕它们。

你得知道你数据库里的“日历”长啥样

在深入聊函数之前,有个关键点必须明白:你的数据库把时间数据存在什么“形状”里,最常见的就是像 2023-10-27 这样的DATE类型,或者更详细的 2023-10-27 15:30:45 这样的DATETIMETIMESTAMP类型,你可以把它们想象成一个完整的日期和时间戳,所有的函数,基本都是围绕这些“时间戳”来进行“截取”、“加减”和“比较”的。

第一类函数:从时间戳里“拆零件”

很多时候,我们不需要完整的时间,只关心其中的一部分,老板让你“统计每个月的销售额”,那你需要从订单日期里把“月份”单独抽出来。

SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你

  • 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天)”。

SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你

  • 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日”这样中文的格式,这时候就需要格式化函数。

SQL里那些时间函数到底怎么用啊,搞不懂的话这篇可能帮到你

  • CONVERT()FORMAT():给时间换件“衣服” 这个函数在不同数据库中差异最大,但目的都一样:改变时间的显示格式。
    • 在SQL Server中常用CONVERTSELECT CONVERT(VARCHAR, GETDATE(), 23) 会把当前日期转换成 2023-10-27 这样的格式,那个数字23代表了一种预定义的格式风格。
    • 在MySQL中常用DATE_FORMATSELECT DATE_FORMAT(NOW(), '%Y年%m月%d日') 会返回 2023年10月27日,这里的 %Y%m等都是格式符。
    • 注意:这个功能虽然好用,但有时会影响查询性能,尤其是在数据量大的时候,所以要谨慎使用。

最重要的实战技巧:组合使用!

真正的威力在于把这些函数像乐高积木一样组合起来,举个例子,你想找出每个季度最后一天下的所有订单。

思路可能是这样的:

  1. YEAR(订单日期) 取出年份。
  2. MONTH(订单日期) 取出月份。
  3. 判断月份是否是3、6、9、12(季末月)。
  4. 再结合 DAY(订单日期) 判断是否是当月的最后一天(这个判断稍微复杂点,可能需要用DATEADD计算下个月第一天再减一天)。

虽然这个例子有点复杂,但它展示了如何将多个时间函数串联起来解决一个具体问题。

总结一下

别被这些函数的名字吓到,它们无非就是帮你做三件事:

  1. :从完整时间戳里提取你需要的部分(年、月、日、小时……)。
  2. :对时间进行加减,或者计算两个时间的间隔。
  3. :改变时间的显示格式,让它更易读。

最好的学习方法就是打开你的数据库管理工具,找一个有日期字段的表,把上面的例子一个一个敲进去试试看,稍微改改参数,看看结果有什么变化,动手练上半小时,绝对比你干巴巴地看文章要管用得多,相信我,一旦你理解了它们的逻辑,这些时间函数就会从“拦路虎”变成你的“得力助手”!