文章目录
- 前言
- 1. DATE_ADD()与 DATE_SUB()
- 1、 实例
- 2. 获取日期间隔
- 1、datediff(date1,date2)
- 2、 timestampdiff(datetype,start_date,end_date)
- 3、获取当月有多少天
- 4、获取当前日期处于当年第几天
- 3. 获取日期
- 1、 以日为基准
- 2、以周为基准
- 3、以月为基准
- 4、以季度为基准
- 5、以年为基准
- 4. date_format(date,format)
- 5. 提取日期
- 1、 判断时间范围为整年
- 2、 年月日自由组合
- 3、 字符串提取年月日
- 3.1 substring
- 3.2 left(data, length)
- 3.3 right(data, length)
前言
本文主要记录关于SQL-日期操作的相关笔记
1. DATE_ADD()与 DATE_SUB()
查找某一天的后n个时间类型的用法:
DATE_ADD(date, INTERVAL n type)
查找某一天的前n个时间类型的用法。
DATE_SUB(date, INTERVAL n type)
- date:起始时间,可以是年月日组成的日期,也可以是年月日时分秒组成给的日期时间。
- n:指定起始日期的前n个时间类型或者后n个时间类型。
- type:指定n的单位是什么时间类型。
type的常用时间类型有:
1、 实例
统计一下record表中首次登录用户且次日也有登录成功记录的概率
这个概率=首次登录用户且次日也有登录成功记录个数/首次登陆记录个数
drop table if exists record;
CREATE TABLE record (
id int(4) NOT NULL,
date1 date NOT NULL,
PRIMARY KEY (id));
)
select round(count(distict id)*1.0/(select
count(distinct id) from table),1)
from record where (id,date1) in
(select id,DATE_ADD(min(date1),interval 1 day)
from record group by id)
1、datediff(date1,date2)
datediff(date1,date2)的功能是计算两个日期之间间隔的天数(date1-date2)
不过本函数只对年月日进行计算,不对时分秒进行计算,比如即便是下述时间相减结果的单位仍是天。
datediff('2021-01-01 23:59:59','2021-01-02 00:00:01')
结果:
-1
2、 timestampdiff(datetype,start_date,end_date)
timestampdiff(datetype,start_date,end_date)的功能是计算两个日期之间间隔的年、月、日、时、分、秒(end_date-start_date)。
timestampdiff(YEAR,'2021-01-01 23:59:59','2021-01-02 00:00:01')
timestampdiff(MONTH,'2021-01-01 23:59:59','2021-01-02 00:00:01')
timestampdiff(DAY,'2021-01-01 23:59:59','2021-01-02 00:00:01')
timestampdiff(HOUR,'2021-01-01 23:59:59','2021-01-02 00:00:01')
timestampdiff(MINUTE,'2021-01-01 23:59:59','2021-01-02 00:00:01')
timestampdiff(SECOND,'2021-01-01 23:59:59','2021-01-02 00:00:01')
3、获取当月有多少天
现有表table1中有time列,下面的操作将以time列的"2021-08-02 11:43:43"值为例
select dayofmonth(last_day(time)) from table1
输出:
31
4、获取当前日期处于当年第几天
现有表table1中有time列,下面的操作将以time列的"2021-08-02 11:43:43"值为例
select dayofyear(time) from table1
输出:
214
现有表table1中有time列,下面的各项操作都将以time列的"2021-08-02 11:43:43"值为例
1、 以日为基准
# 获取当前日期
select curdate() from table1
# 输出:2022-01-02
2、以周为基准
# 当日属于周几
select WEEKDAY(submit_time)+1 from table1
# 输出:1
# 当前日期所属周第一天的日期
select date_sub(time,interval WEEKDAY(time) day) from table1
# 输出:2021-08-01 11:43:43
3、以月为基准
# 取上个月第一天。
select date_sub(concat(date_format(time,'%Y-%m-'),'01'),interval 1 month) from table1
# 输出:2021-07-01
# 取当月最后一天。
select last_day(time) from table1
# 输出:2021-08-31
# 取当月第一天
# 方式1 拿当前日期的day-当月截至当日的天数再+1。
select DATE_sub(time,interval day(time)-1 day) from table1
select DATE_add(time,interval -day(time)+1 day) from table1
# 输出:2021-08-01 11:43:43
# 方式2 字符串连接
select concat(date_format(time,'%Y-%m-'),'01') from table1
# 输出:2021-08-01
# 取下个月第一天
select DATE_add(time-day(time)+1,interval 1 month) from table1
# 输出:2021-09-01 11:43:43
4、以季度为基准
# 获取当前季度
select QUARTER(time) from table1
# 输出:3
# 获取当前季度第一天
# 算出当前季度,然后将当年的1月1日加上(季度数*3-3)即可得当前季度的第一天。
select DATE_ADD(DATE_SUB(time,INTERVAL dayofyear(time)-1 DAY),INTERVAL QUARTER(time)*3-3 month) from table1
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM time),1) + interval QUARTER(time)*3-3 month),'%Y-%m-'),'01') from table1
# 输出:2021-07-01 11:43:43/2021-07-01
# 获取当前季度最后一天
# 算出当前季度,然后将当年的1月1日加上(季度数*3-1),在使用last_day即可得当前季度的最后一天。
select last_day(DATE_ADD(DATE_SUB(time,INTERVAL dayofyear(time)-1 DAY),INTERVAL QUARTER(time)*3-1 month)) from table1
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM time),1) + interval QUARTER(time)*3-1 month) from table1
# 输出:2021-09-30/2021-09-30
5、以年为基准
# 取当前年
select year(time) from table1
select extract(year from time) from table1
# 输出:2021
# 取当年的第一天的日期
# 方式1
select DATE_SUB(time,INTERVAL dayofyear(time)-1 DAY) from table1
# 输出:2021-01-01 11:43:43
# 方式2
select MAKEDATE(year(time),1) from table1
# 输出:2021-01-01
# 取当年的最后一天日期
select concat(YEAR(time),'-12-31') from table1
# 输出:2021-12-21
date_format(date,format)根据format格式来输出结果。其中format格式可以选择如下:
说明中有单独例子的是以’2022-01-09 18:10:40’参考。
格式 | 说明 |
%Y | 年,4位 |
%y | 年,2位 |
%M | 月名全称英文(eg: ‘January’) |
%b | 月名缩写英文(eg: ‘Jan’) |
%m | 月,数值(00-12) |
%c | 月,数值(1-12) |
%d | 日(月的天),数值(00-31) |
%e | 日(月的天),数值(0-31) |
%H | 时(00-23) |
%k | 时(0-23) |
%h | 时(01-12) |
%l | 时(1-12)(m字母前面的字母l) |
%i | 分,数值(00-59) |
%S/s | 秒(00-59) |
%a | 缩写星期名 |
%D | 带有英文后缀的月中的天(eg: ‘9th’) |
%f | 微秒 |
%j | 天(年的天)(001-366) |
%p | AM或PM |
%r | 时间,12-小时(hh:mm:ss AM或PM) |
%T | 时间,24-小时(hh:mm:ss) |
%U | 周(00-53)(周日作为周的第一天) |
%u | 周(00-53)(周一作为周的第一天) |
%W | 星期名 |
%w | 周的天(0=星期日,6=星期六) |
%V | 周(01-53)(周日作为周的第一天,与%X搭配使用) |
%v | 周(01-53)(周一作为周的第一天,与%x搭配使用) |
%X | 年(周日作为周的第一天,4位,与%V搭配使用) |
%x | 年(周一作为周的第一天,4位,与%v搭配使用) |
下面举个具体的例子:
数据库中日期时间为:‘2022-01-09 18:10:40’
SELECT date_format(date,'%b %d %Y %h:%i %p') FROM table1
结果:
'Jan 09 2022 06:10 PM'
1、 判断时间范围为整年
这里以判断时间范围为整个2022年。
方式1:
date>='2022-01-01' and date<'2023-01-01'
方式2:
between '2022-01-01' and '2022-12-31'
方式3:
year(date)=2022
2、 年月日自由组合
%Y为年,%m为月,%d为日,可以组合使用,年月日之间的连接符可以使用如下代码块中的“-”号,或者可以自己设定其他的。
按年月
date_format(date,'%Y-%m')
按月
date_format(date,'%m')
按日
date_format(date,'%d')
3、 字符串提取年月日
当原始date为“2022-01-01”之类的数据格式时,进行提取
3.1 substring
substring(date,start,length)
- date——要提取所用的完整日期
- start——整数或可以隐式转换为int 的表达式,指定子字符串的开始位置。
- length——整数或可以隐式转换为 int的表达式,指定要提取子字符串的长度
eg:
提取年
substring(date,1,4)
提取月
substring(date,6,2)
提取日
substring(date,9,2)
3.2 left(data, length)
取date的前length个字符。
提取年
left(date,4)
提取年月
left(date,7)
3.3 right(data, length)
取date的后length个字符。
提取日
right(date,2)
提取月日
right(date,5)