前言
时间在数据库中经常作为时间索引,在数据入库和出库以及更新的时候都需要变化。在一些指标计算或者是提取某段时间的数据时,都会根据数据库中的时间索引数据进行操作。因此很大一部分我们操作数据都得先从时间数据下手,但是想要真正提取到我们想要的时间作为索引,还需要我们掌握许多功能函数方便我们操作,这是一个比较复杂的运用过程。
在本人博客数据库MySQL已有三篇详细解释了大部分关于处理时间数据的函数以及实例运用,如果对这一方面有需求的可以看这两篇:
一文速学-玩转MySQL获取时间、格式转换各类操作方法详解
一文速学-玩转MySQL时间选取各类函数操作详解+实例代码
第一篇具体讲述了所有获取SQL本地时间的函数,以及其他数据类型与时间数据类型相互转换。
第二批具体讲述了所有MySQL时间数据选取具体指定时间的函数。以上两篇文章都有具体的代码演示。希望能够帮助到正在看此博文的各位,如果还有什么问题解决不了尽请在评论区提出,博主会一一作答。下面开始正文。
一、INTERVAL
1.基础使用
INTERVAL关键字一般使用格式为:
interval [+/-]<数值> <时间单位>
例如:
interval 3 day
代表意义为3天的时间变量,可由时间变量进行相加减。这里展示SQL表为:
例如我们想要将create_time推迟三天:
select (create_time-INTERVAL 3 day) as time from value_test
也可以为-3天:
select (create_time+INTERVAL -3 day) as time from value_test
效果是一样的。
时间单位表为:
时间单位 描述
year 年
quarter 季度
month 月
week 周
day 天
hour 小时
minute 分钟
second 秒
microsecond 微秒
second_microsecond
秒_微秒
minute_microsecond 分_微秒
minute_second 分_秒
hour_microsecond 时_微秒
hour_second 时_秒
hour_minute 时_分
day_microsecond 天_微秒
day_second 天_秒
day_minute 天_分钟
day_hour 天_小时
year_month 年_月
如果我们想要在原基础上加上1小时10分钟10秒:
select (create_time+INTERVAL '1:10:10' hour_second) as time from value_test
这里要注意一下指定的时间单位向下兼容性,当我们选择的是hour_second小时到秒时,输入的数值仅为两个数值,例如:
select (create_time+INTERVAL '10:10' hour_second) as time from value_test
会自动识别为10分10秒:
其他的连续时间段表示单位也都一样,例如:
select (create_time+INTERVAL '10:10:10' day_second) as time from value_test
2.在函数中使用
interval一般使用场景都在场景筛选中使用,比如where的条件判断,或者是筛选、去一段指定的时间片段。如取近七日的时间段的数据:
and time between cast(date_sub(date_format(curdate(),'%Y%m%d') , interval 7 day) as DECIMAL) and cast(date_sub(date_format(curdate(),'%Y%m%d') , interval 1 day) as DECIMAL)
也经常在date_add和date_sub这种时间运算函数中表示时间变量使用,add和sub都可以通过修改正负号来替换功能。
二、INTERVAL()函数
在MySQL输入interval()函数就会显示相应的语法格式:
INTERVAL(N,N1,N2,N3,...)
INTERVAL()函数为分区函数,其中,N是要判断的数值,N1,N2,N3,...是分段的间隔。
这个函数的返回值是段的位置:
如果N<N1,则返回0,
如果N1<=N<N2,则返回1,
如果N2<=N<N3,则返回2。
区间是左闭右开的。
这里我们用time这一列开展示效果:
我们想要把time列的时间归类为20220601-20220610为一个区域,20220611-20220620为一个区域,20220621-20220630为一个区域,每隔10天为一个分区。
select INTERVAL(time,20220611,20220621,20220631) as time from value_test
分完区之后一般进行统计,就可以得到对应区间的个数了:
1. select INTERVAL(time,20220611,20220621,20220631) as times ,count(*) as count 2. from value_test 3. GROUP BY times