MySql查询上周(周一到周日)每天的日期!土方!
首先介绍一个函数:YEARWEEK(date[,mode])
主要说明一下后面的可选参数mode,这个参数就是指定一周里面哪一天是第一天。
默认一周是从周日开始,这显然不太符合我们的要求。要指定每周从周一开始的话,mode=1就好了。
下图为该参数的说明:
接下来进入正题,直接上SQL吧
SELECT
date_format(lastWeek.`timeDay`,'%Y-%m-%d') as 'timeDay'
FROM (
select DATE_SUB(NOW(),interval 13 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 12 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 11 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 10 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 9 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 8 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 7 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 6 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 5 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 4 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 3 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 2 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 1 day) as 'timeDay'
) as lastWeek
WHERE YEARWEEK(lastWeek.`timeDay`,1) = YEARWEEK(NOW(),1)-1
为什么说这是个土方呢,哈哈!首先看上去莫名的土,理解一下逻辑如下:
假如今天是周一,我要得出上周一和上周日的日期,很简单:
上周一距离今天7天=select DATE_SUB(NOW(),interval 7 day);
上周日距离今天1天=select DATE_SUB(NOW(),interval 1 day); 没毛病,那如果今天是周日呢?
上周一距离今天13天=select DATE_SUB(NOW(),interval 13 day);
上周日距离今天7天=select DATE_SUB(NOW(),interval 7 day); 没错,这里就是查询出来上周所有可能的日期,因为这个问题的难点就是
我们不能指定当前的日期。 查询出来之后在结合MySql的函数YEARWEEK,就可以得出上周的日期了
我写这个的SQL的原因,是因为有这么个需求:要统计上周每天的注册人数,以柱状图的形式展现。
要是直接使用
SELECT
DATE_FORMAT(regist_date,'%Y-%m-%d') '注册时间',COUNT(*) as '注册人数'
FROM t_user
WHERE YEARWEEK(regist_date,1) = YEARWEEK(NOW(),1)-1
GROUP BY DATE_FORMAT(regist_date,'%Y-%m-%d')
会出现如果有一天没有注册人数的话,这一天就没有数据,产品的需求呢是没有注册人数的话显示为0。
于是就有了下面的写法
SELECT
t1.timeDay as '日期',t2.`注册人数`
FROM (
SELECT
date_format(lastWeek.`timeDay`,'%Y-%m-%d') as 'timeDay'
FROM (
select DATE_SUB(NOW(),interval 13 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 12 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 11 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 10 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 9 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 8 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 7 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 6 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 5 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 4 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 3 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 2 day) as 'timeDay'
UNION ALL
select DATE_SUB(NOW(),interval 1 day) as 'timeDay'
) as lastWeek
WHERE YEARWEEK(lastWeek.`timeDay`,1) = YEARWEEK(NOW(),1)-1
) as t1
LEFT JOIN (
SELECT
DATE_FORMAT(regist_date,'%Y-%m-%d') '注册时间',COUNT(*) as '注册人数'
FROM t_user
WHERE YEARWEEK(regist_date,1) = YEARWEEK(NOW(),1)-1
GROUP BY DATE_FORMAT(regist_date,'%Y-%m-%d')
) as t2 ON t1.timeDay = t2.`注册时间`
ORDER BY t1.timeDay
这样就搞定了。你还可以以这种方法查出上个月的日期哦。
希望能帮到你~
MySql查询上周(周一到周日)每天的日期!土方!的更多相关文章
- JAVA获取当前日期所在的周一到周日的所有日期集合
/** * 获取当前日期所在的周一到周日的所有日期集合 * @return */ public static List<Date> getWeekDateList() { Calendar ...
- php获取本周周一、周日时间,上周周一、周日时间,本月第一天,本月最后一天,上个月第一天,最后一天时间
权声明:本文为博主原创文章,未经博主允许不得转载. //这个星期的星期一 // @$timestamp ,某个星期的某一个时间戳,默认为当前时间 // @is_return_timestamp ,是否 ...
- js获取选中日期的当周的周一和周日
js获取选中日期的当周的周一和周日 第一种方法(推荐): function getWeekStr(str) { // 将字符串转为标准时间格式 str2 = Date.parse(str); let ...
- MySQL查询今天/本周/上周/本月/上个月份的数据
MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查询本周.上周.本月.上个月份的数据,如果您对MySQL查询方面感兴趣的话,不妨一看. 查询当前今天的数据 SELECT name,sub ...
- mysql YEARWEEK(date[,mode]) 函数 查询上周数据 以及本周数据
通常使用下边sql即可(如果数据库设置了周一为一周起始的话): 查询上周数据(addtime为datetime格式) SELECT id,addtime FROM mall_order WHERE ...
- MySQL查询今天/昨天/本周、上周、本月、上个月份数据的sql代码
MySQL查询本周.上周.本月.上个月份数据的sql代码 作者: 字体:[增加 减小] 类型:转载 时间:2012-11-29我要评论 MySQL查询的方式很多,下面为您介绍的MySQL查询实现的是查 ...
- MySQL查询本周、上周、本月、上个月份数据的sql代码(转)
感谢:http://www.jb51.net/article/32277.htm ----------------------------------------------------------- ...
- mysql查询今天、昨天、上周
mysql查询今天.昨天.上周 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE ...
- mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据
mysql查询今天.昨天.7天.近30天.本月.上一月 数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT ...
随机推荐
- Optim High Performance Unload [HPU]
目录 一.简介 二.安装 三.基本配置 四.卸数 4.1. 命令行导出 4.2. 控制文件 4.2.1. 从表空间容器卸数 4.2.2. 从备份镜像中卸数 4.2.3. 控制文件语法参考 4.3. 存 ...
- 从0到1用react+antd+redux搭建一个开箱即用的企业级管理后台系列(基础篇)
背景 最近因为要做一个新的管理后台项目,新公司大部分是用vue写的,技术栈这块也是想切到react上面来,所以,这次从0到1重新搭建一个react项目架子,需要考虑的东西的很多,包括目录结构.代码 ...
- 21、nginx之ngx_http_proxy_module模块
Nginx 的代理功能是通过 ngx_http_proxy_module 模块来实现的.默认在安装 Nginx 时已经安装了ngx_http_proxy_module模 块,因此可直接使用 ngx_h ...
- 10、ssh中scp、sftp程序详解
每次都是全量拷贝,rsync是增量拷贝 10.1.scp的基本用法: -r:拷贝目录; -p: 保持属性: -l:限速设置; scp -P52113 /etc/hosts lc@172.16.1.41 ...
- Series 1 java秒组合数
Series 1 举几个例子发现, 系数中间对称,很容易想到组合数 c(n,m)==c[n,n-m).此题就是高精度求组合数,java秒之. time:1825ms ,接近时限,如果n还稍微大一 ...
- 常用API文字版
常用API Object类 jvm启动,默认导入的是java.lang包中的内容,该包下的内容不需要import进行导入. 概念 该类是java体系中的根类,所有对象都将该类作为直接或者间接父类 所有 ...
- MySql:使用Navicat定时备份数据库
Navicat自带就有备份 还可以直接计划任务,很方便. 1. 新建计划 打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击" ...
- hadoop学习(二)hadoop集群的启动
一.完全分布式集群环境的搭建 1.配置hosts文件:将三台集群服务器的主机名与IP的对应关系互相配置到对方的hosts文件中,以便对方服务器能通过主机名寻找IP,hosts文件在/etc目录下. 2 ...
- 线程中的yield()
属于本地方法 /** * A hint to the scheduler that the current thread is willing to yield * its current use o ...
- pixel的Edxposed刷机过程
1.先解开bl锁 这里的步骤,因为我机子本来就是解过的了,所以简单记录一下过程好了 第一步:确保你的环境变量是否设置好了,判断的标准就是打开终端(我是mac),usb连接上,然后输入 adb devi ...