前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql日期操作

Mysql日期操作

作者头像
创译科技
发布2019-10-29 15:58:25
5.9K0
发布2019-10-29 15:58:25
举报
文章被收录于专栏:Node开发

前面两天主要介绍了limit分页以及count函数获取行数两个高频语法,分页在我们日常开发几乎是必会的一个技术点,所以做好分页的优化是势在必行的。本篇谈谈日期处理我们如何操作,在订单类型业务中我们经常需要对时间做处理,通过时间来分页显示订单等,所以不可避免的需要对日期处理操作滚瓜烂熟。首先我们创建一个订单表,字段大约20多个字段,然后使用存储过程插入1万条数据。

SUBSTR函数

首先我们来设想这么一个业务需求:用户下单在数据库保存用户下单时间pay_date,使用的datetime格式,用户下单成功需要发货,但是datetime显示付款时间精确到秒,我们商家后台发货系统只需要精确到日期,这个时候我们其实就可以使用到substr函数,来分割字符串,我们来看下substr函数的基本用法:

代码语言:javascript
复制
select substr(datetime, startChar, endChar) as pay_date from table;

可以很明显看到,substr函数携带3个参数:

  • datetime:数据列时间字段,比如我们截图中的pay_date。
  • startChar:开始截取的起始字符,从1开始。
  • endChar:结束截取的字符位置。

比如我们上面需要将时间精确到天,也就是要将时分秒剔除,我们都知道数据库时间保存一般格式为:2019-01-01 00::00:00,所以我们可以使用以下语句去截取:

代码语言:javascript
复制
select substr(pay_date, 1, 10) from aok_score_info limit 1;

很简单的就从datetime格式中成功提取到日期了,那我们来设想另外一种需求:现在很多公司都拥有招商团队,需要统计周一到周五工作日的业绩,那我这条订单下单时间如何转化成星期几呢?所以我们这时候可以使用dayofweek函数。

dayofweek函数

我们先来看下dayofweek函数的基本语法:

代码语言:javascript
复制
select pay_date, DAYOFWEEK(pay_date) from aok_score_info limit 1;

dayofweek函数很好理解,就是传入一个日期,返回日期对应星期几。那我们再来设想一种需求:比如外卖平台一般会有创建订单后15分钟若未进行付款则自动取消订单的操作,那我们如何操作呢?可能大多数人的做法是从数据库取出这条待付款订单,然后和当前时间对比判断是否超过15分钟来完成这个需求,但是这样数据库读写逻辑加上业务逻辑就为了完成这么一个功能未免小题大做,这时候我们可以很简单的使用timestampdiff函数来实现统计两个时间之间的间隔。

timestampdiff函数

我们先看下timestamp函数的基本语法:

代码语言:javascript
复制
select created_date, pay_date, timestampdiff(minute, create_date, pay_date) from aok_score_info limit 1; 

timestampdiff函数有三个参数:

  • minute:取值有5个,second表示计算秒级间隔,minute表示计算分钟间隔,hour表示小时间隔,day表示天数间隔,month表示月份间隔,year表示年份间隔。
  • created_date:开始时间,比如订单创建时间。
  • pay_date:结束时间,比如订单付款时间。

在数据库我们可以看到日期格式为2019-01-01 00:00:00这种标准格式,但是我们通过代码查询出的数据经常日起都不是标准格式,比如这是我通过代码读书来的一条商品数据:

代码语言:javascript
复制
{
                "id": 2143,
                "pictUrl": "/shop_goods/2019/2/26/0/0/92122639.jpg",
                "shopTitle": "宜佳生活家居",
                "title": "梦洁家居 斜纹全棉四件套体面 浅黄色",
                "score": 1980,
                "pics": [
                    "/shop_goods/2019/2/26/0/0/9212263910.jpg",
                    "/shop_goods/2019/2/26/0/0/9212263911.jpg",
                    "/shop_goods/2019/2/26/0/0/9212263912.jpg",
                    "/shop_goods/2019/2/26/0/0/9212263913.jpg",
                    "/shop_goods/2019/2/26/0/0/9212263914.jpg"
                ],
                "detail": {
                    "pics": [
                        "/shop_goods/2019/2/26/0/0/9212263915.jpg",
                        "/shop_goods/2019/2/26/0/0/9212263916.jpg",
                        "/shop_goods/2019/2/26/0/0/9212263917.jpg"
                    ]
                },
                "created_date": "2019-04-08T09:42:48.000Z",
                "belong_id": "2143",
                "plat_link": "https://item.m.jd.com/product/31807819009.html",
                "location_type": 1
            }

可以明显看到商品上传时间created_date不是正常时间格式,所以我们肯定需要对日期进行格式化,这时候就可以使用日期处理最常用的函数:date_format函数。

date_format函数

date_format可以对时间做一些很常规的格式化,比如它可以将上面的2019-04-08T09:42:48.000Z格式化为标准格式,它也可以将时间转换成各种格式。我们先看下date_format函数的一般语法:

代码语言:javascript
复制
select created_date, date_format(created_date, '%Y-%m-%d-%T') from aok_score_info limit 1;

参数很容易理解,第一个参数指定时间,第二个参数指定格式,通过date_format我们可以轻松实现将时间只取日期,也可以将时间转化为星期几。我们可以简单看几种date_format指定不同格式的用法:

可以看到我们通过date_format可以轻松将时间格式转换成我们想要输出的形式,当然date_format第二个参数可以指定更多各种输出格式,我这里不一一讲解,贴下列表可以自行测试:

日期操作的函数有很多,还有date_add函数可以对时间相加,date_sub可以对时间相减,还有timestamp函数转化时间戳等等,但是最常用的应该还是上面讲到的几个函数。接下来篇末主要谈谈如果查询中where使用时间间隔查询如何能够优化呢?

时间间隔查询如何优化

这里针对时间查询优化我主要觉得有以下几点:

  • 使用between...and范围查询,然后在时间段添加索引可以命中索引。
  • 可以使用timestamp代替datetime,可以更节省空间。
  • 对于统计类的查询【如查询连续几个月的数据总量,或查询同比、环比等】,可以通过定时查询并统计到统计表的方式提高查询速度
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿周先森 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档