作为一名程序员,不知道你在求职面试时有没有遇到要求手写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类型;
需要注意的是后面减去前面。
微信公众号:爱开发