数据库的日期函数

时间类型

1.1 datetime 时间日期 格式是YYYY-mm-dd HH:ii:ss 表示的范围是从1000到9999年。有0值,0000-00-00 00:00:00

1.2 date 日期 就是datetime中date部分

1.3 time 时间(段)指定的某个区间之间

1.4 timestamp 时间戳,格式不是时间戳,只是从1970年开始的YYYY-mm-ddHH:ii:ss 格式 与datetime完全一致。

1.5 year 年份

在这里插入图片描述

在这里插入图片描述
2060 年 和1970 年 >70是1900 <70 是2000

timestamp 字段:只要当前所在的记录被更新,该字段一定回自动更新当前时间。
在这里插入图片描述

2 当前时间

2.1now 返回当前系统的日期+时间

select now()

2.2curdate 返回当前系统日期,不包含时间

select CURDATE();

2.3curtime() 返回当前时间,不包含日期

select curtime();

3 可以获取指定的部分,年、月、日、小时、分钟、秒

3.1 年

select year(now()) 年;
select year(‘1998-1-1’) 年;
在这里插入图片描述
select year(hiredate) 年 from employees;

3.2 月

select month(now()) 月
在这里插入图片描述
select monthname(now()) 月;

在这里插入图片描述

3.3 日 day

3.4 小时 hour

3.5 分钟 minute

3.6 秒 second

4 str_to_dat()和date_format()

在这里插入图片描述
在这里插入图片描述

4.1 str_to_dat()

select str_to_date(‘1998-3-2’,’%Y-%c-%d’) as out_put

实际例子: 查询入职日期为1992-4-3 的员工信息

select * from employee where hiredate = ’ 1992-4-3’ ;
在这里插入图片描述
select * from employee where hiredate = ’ 4-3 1992‘ ; 就找不到了==》需要进行转换

select * from employee where hiredate = str_to_date(‘4-3 1992’,’%c-%d %Y’);

在这里插入图片描述

4.2 date_ format

select date_format(now(),’%y年%m月%d日’) as out_put
在这里插入图片描述
查询有奖金的员工名和入职日期(xx月/XX 日 XX年)
select last_name,date_format(hiredate,’%m月/%d日 %y年’) 入职日期
from employees where comnission_pct is not null;
在这里插入图片描述

5 事例:

1、获取当月的每天数据总量:

SELECT
count(1) AS 别名,
DAY(时间字段名) as 别名
FROM
表名
WHERE MONTH(时间字段名) = MONTH( NOW( ) )
GROUP BY DAY(时间字段名)

select count(*) ,day(create_time) day from order_master where month(create_time)= month(NOW()) group by day(create_time)

2、获取前月的每天数据总量:

SELECT
count(1) AS 别名,
DAY(时间字段名) as 别名
FROM
表名
WHERE MONTH(时间字段名) = MONTH( NOW( ) )-1
GROUP BY DAY(时间字段名)
3、获取去年的每月数据总量:

SELECT
count(1) AS 别名,
MONTH(时间字段名) as 别名
FROM
表名
WHERE YEAR(时间字段名 ) = YEAR( NOW( ) )-1
GROUP BY MONTH(时间字段名)
4、获取今年的每月数据总量:

SELECT
count(1) AS 别名,
MONTH(时间字段名) as 别名
FROM
表名
WHERE YEAR(时间字段名 ) = YEAR( NOW( ) )
GROUP BY MONTH(时间字段名)

6 前14天,时间戳转日期,查毫秒差:

Mysql中使用sql语句查询前一个天、前一周、前一月时间的方法
https://blog.csdn.net/YickreeSuen/article/details/79980446

前14天
在数据库总存的试varchar的时间例如;2019-11-18 01:42:08

SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 14 DAY) <= date(时间字段名)

最近两周:
SELECT * FROM 表名 where date_sub(CURDATE(),INTERVAL (WEEKDAY(CURDATE()) +7) day) <= DATE(时间字段名)

(WEEKDAY(date) 返回 date 的星期索引(0 = Monday, 1 = Tuesday, … 6 = Sunday):
mysql> SELECT WEEKDAY(’1998-02-03 22:23:00’);

时间转化

时间戳转日期:
FROM_UNIXTIME(updatetime)

https://blog.csdn.net/qq_36614559/article/details/80093045

https://www.cnblogs.com/ltian123/p/11077901.html

在这里插入图片描述

日期转时间戳;
UNIX_TIMESTAMP(updatetime)

在这里插入图片描述

select *,UNIX_TIMESTAMP(create_time)from order_master
在这里插入图片描述

查毫秒差:
UNIX_TIMESTAMP(updatetime)-UNIX_TIMESTAMP(timestamp)

在这里插入图片描述

时间格式化:
date_format( timestamp, ‘%Y%m’ ));

DATE_FORMAT将传来的Date类型转为自己需要的格式,如%Y-%m-%d %H:%i:%s会将传来的startTime和endTime转为"yyyy-MM-dd HH:mm:ss"格式

select * from tableName a
where a.time between DATE_FORMAT(#{startTime},’%Y-%m-%d %H:%i:%s’) and DATE_FORMAT(#{endTime},’%Y-%m-%d %H:%i:%s’)

https://www.jianshu.com/p/593ace0424ff

注:

SELECT
id,
DATE_FORMAT(create_time, ‘%Y-%c-%e’)
FROM epc_mes_item
WHERE DATE_FORMAT(create_time, ‘%Y-%c-%d’) >= ‘2018-11-19’;

0查询’2020-01-10的数据
select * from order_master where DATE_FORMAT(create_time,’%Y-%m-%d’) = ‘2020-01-10’

查看 ‘2020-01-09’ 到 ‘2020-01-11’的数据
select * from order_master where DATE_FORMAT(create_time,’%Y-%m-%d’) between ‘2020-01-09’ and ‘2020-01-11’

==========================

需求:

写个sql 查询 smslog表 要有手机号 发送内容 插入时间 插入时间和更新时间的时间差以秒为单位 查询最近两星期的

sql:

select mobile,content,msgid,timestamp,updatetime,
UNIX_TIMESTAMP(updatetime)-UNIX_TIMESTAMP(timestamp) time from smslog where date_sub(CURDATE(),INTERVAL (WEEKDAY(CURDATE()) +7) day) <= DATE(timestamp) order by timestamp desc;

发布了142 篇原创文章 · 获赞 3 · 访问量 5387

猜你喜欢

转载自blog.csdn.net/Insist___/article/details/105095187