玖叶教程网

前端编程开发入门

扎心了!面试时遇到要手写sql,结果函数拼写不出来

作为一名程序员,不知道你在求职面试时有没有遇到要求手写sql语句的。

我就遇到过,有次我到一家软件公司应聘软件开发岗位时,面试官就问了我这样一个问题,还拿纸笔叫我手写一条sql。

题目是这样的:

Mysql数据库中有一张用户表A,里面有用户编号,身份证号码,如何根据身份证计算出每个用户的具体年龄?

其实这道题目不难,可以从身份证中把用户的年份抽出来,再和当前的年份对比,就可以了。字符串截取函数substring倒是记得,对于年份相减的函数记不起来,知道有这么一个函数,奈何英文水平有限,拼写不出timestampdiff这个函数,缺点彻底暴露了,尴尬了。

要不是手写,直接上机操作那就可以避免了。这也给我一个提示,得好好提高自己的英文词汇量才行,学习知识时,不能一知半解,浅尝辄止。要想学习好,必须养成独立钻研、务求甚解的习惯。

今天来聊一聊mysql timestampdiff()函数用法。

首先来看看官方对这个函数的描述

TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)

简单翻译下,TIMESTAMPDIFF函数返回datetime_expr2 ? datetime_expr1,

的结果, 其中datetime_expr1和datetime_expr2是DATE或DATETIME表达式。

TIMESTAMPDIFF函数允许其参数具有混合类型,例如,datetime_expr1是DATE值,datetime_expr2可以是DATETIME值。 如果使用DATE值,则TIMESTAMPDIFF函数将其视为时间部分为“00:00:00”的DATETIME值。


unit参数是确定(datetime_expr2-datetime_expr1)的结果的单位,表示为整数。 以下是有效单位:

  • MICROSECOND 微秒
  • SECOND 秒
  • MINUTE 分钟
  • HOUR 小时
  • DAY 天
  • WEEK 周
  • MONTH 月份
  • QUARTER
  • YEAR 年份

以文章开头的题目为例,

select user_id ,timestampdiff(year,substring(card_num, 7, 8),now()) as age from a


如果想统计月份,只需要将unit参数从year参数换成month即可,例如

select user_id ,timestampdiff(month,substring(card_num, 7, 8),now()) as age from a


同样,如果想统计天数,我们将unit参数换成day即可。

select user_id ,timestampdiff(day,substring(card_num, 7, 8),now()) as age from a

timestampdiff在很多场景会使用到,比如公司统计员工的工龄、统计订单平均发货时间等。

还是应该重视的。另外,还有TIMESTAMPADD、

TIMESTAMP都应该掌握,建议系统性学习,这样归纳总结起来比较容易理解,掌握得更透彻。要是学得比较零散,不利于构建自己的知识体系。

由于笔者知识水平有限,文中错漏之处在所难免,如有不足之处,欢迎纠正,感谢。

拓展:其他数据库查询日期间隔函数

hive中查询日期间隔的函数是datediff:

select datediff('2022-03-31','2022-03-01');

输出结果:30

presto中函数是date_diff,语法和hive有所不同:

select date_diff('day',cast('2022-03-01' as date),cast('2022-03-31' as date));

输出结果:30

细心的你应该知道两者在语法上有什么不同了。

date_diff函数:

presto中date_diff函数和hive datediff不同点。

  • 需要提供参数'day',表示查询的是天数间隔;要查询小时,则提供参数'hour'
  • 后面传参限制为date、timestamp类型;
  • 需要注意的是后面减去前面。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言