星期数的问题

  1 计算日期是周几

这个问题看似很简单,可以用MySQL内置函数来计算

(1) weekday(date)其返回值是0-6,0代表Monday, 6代表Sunday;

(2) dayofweek(date)其返回值是1-7,但是它更不好理解,1代表的是Sunday, 6代表的Saturday;

(3) dayname(date)其返回值直接是具体的名词,Monday, Tuesday...

以上三种方法都能够根据日期计算周几,但是都有一定的局限,相对weekday()最符合中国人的习惯。

我们还有另外一个方便的计算方法,如我们知道确切的某天是周几,如:2000-01-03是周一,那么我就可以用下列方式计算某个日期属于周几了

select (datediff(date,'2000-01-03')+1)%7,结果为1就是周一,结果为2就是周二,结果为7就是周日

select (datediff('2017-12-22','2000-01-03')+1)%7 = 5 则 2017-12-22 是周五,我们可以取任意为周一的日期作为参照基数来计算,非常符合中国人的思维习惯。

2 按周分组

这个问题如果使用系统函数week(date),当一个周夸年时week会将一个周拆分为两个周统计,具体情况如下:

建立测试数:

CREATE TABLE `sales` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`date` datetime NOT NULL,
`cost` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of sales
-- ----------------------------

INSERT INTO `sales` VALUES ('8', '2017-01-01 00:00:00', '100');
INSERT INTO `sales` VALUES ('1', '2017-11-30 00:00:00', '100');
INSERT INTO `sales` VALUES ('2', '2017-12-01 00:00:00', '100');
INSERT INTO `sales` VALUES ('3', '2017-12-02 00:00:00', '100');
INSERT INTO `sales` VALUES ('4', '2017-12-31 00:00:00', '100');
INSERT INTO `sales` VALUES ('5', '2018-01-01 00:00:00', '100');
INSERT INTO `sales` VALUES ('6', '2018-01-02 00:00:00', '100');
INSERT INTO `sales` VALUES ('7', '2018-01-10 00:00:00', '100');

使用week函数按周获取每周的cost

select week(date),sum(cost)
from sales
group by week(date);

  

week 函数计算的结果是把 2017-12-31,2018-01-01,2018-01-02算作一周,而且是算作2017年最后一周,实际应用中我们把2018-01-01 ~ 2018-01-07视作一周, 2017-12-25 ~ 2017-12-31视作一周,所以week函数明显不符合我们实际使用需求。

我们介绍一种类似星期几计算的方法,同样使用日期参照法,2017-01-02为周一,方便计算我们使用它作为参照

select floor(datediff(date,'2017-01-02')/7) as week_number,
date_add('2017-01-02',interval floor((datediff(date,'2017-01-02')/7))*7 day) as begin_dt,
date_add('2017-01-02',interval floor((datediff(date,'2017-01-02')/7))*7+6 day) as end_dt,
sum(cost) as total
from sales
group by floor((datediff(date,'2017-01-02')/7));

  

  这样不但可以计算出周,还可以计算出每周的开始与结束时间。

MySQL经典编程问题的更多相关文章

  1. 《MySQL 存储过程编程》-读书笔记

    本书结构: 第一部分:存储编程基础 第1章:存储过程程序基础 第2章:MySQL存储编程指南 第3章:语言基础 第4章:语句块 第5章:在存储程序中使用SQL 第一章:MySQL存储程序介绍 存储程序 ...

  2. 10 个 MySQL 经典错误【转】

    Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 mysql> show variables like '%max_connec ...

  3. 使用C语言调用mysql数据库编程实战以及技巧

    今天编写使用C语言调用mysql数据库编程实战以及技巧.为其它IT同行作为參考,当然有错误能够留言,共同学习. 一.mysql数据库的C语言经常使用接口API 1.首先当然是链接数据库mysql_re ...

  4. 数据库MySQL经典面试题之SQL语句

    数据库MySQL经典面试题之SQL语句 1.需要数据库表1.学生表Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  5. 【不断更新】mysql经典50道题自我练习

    mysql经典50道题自我练习 测试数据和练习题均转载自CSDN博主@启明星的指引的文章sql语句练习50题(Mysql版),用于mysql的每日自我练习 表名和字段 –1.学生表 Student(s ...

  6. MYSQL经典练习题,熟悉DQL

    MYSQL经典练习题 (本练习题可让你熟悉DQL,快速的上手DQL) 首先,先在数据库中建立基本数据库以及表项: DROP DATABASE IF EXISTS `test`; CREATE DATA ...

  7. 经典书籍---MySQL经典书籍下载

    以下是一些经典的MySQL书籍电子版,括号内为提取码,若需自取. 欢迎阅读纸质版,尊重作者版权 高性能MySQL_中文版 [ hre3 ] 高性能MySQL_英文版[ m2xj ] MySQL技术内幕 ...

  8. oracle/mysql经典电子书籍pdf下载

    Oracle LZ写的书,深入结合oracle设计.优化/SQL优化.应用层架构与优化.大量生产案例,敬请期待... Oracle编程艺术 深入理解数据库体系结构(第3版) 链接:https://pa ...

  9. (ZZ)WPF经典编程模式-MVVM示例讲解

    http://www.cnblogs.com/xjxz/archive/2012/11/14/WPF.html 本篇从两个方面来讨论MVVM模式: MVVM理论知识 MVVM示例讲解 一,MVVM理论 ...

随机推荐

  1. docker1.13.1的安装与卸载及mysql5.5安装实例

    docker中国官方地址:https://www.docker-cn.com/ 您可以使用以下命令直接从该镜像加速地址进行拉取: $ docker pull registry.docker-cn.co ...

  2. WPF中应用字体图标

    一.什么是字体图标 我们在进行GDI(图形界面)编程的过程中图标是不可少的.近些年随着网络的繁荣和移动应用的繁荣,矢量图的应用越来越火. 矢量图是一种用数学方法描述的.由一系列点和线组成的图,因此相比 ...

  3. C#事件の.net下的EventArgs和EventHandler

    事件参数(EventArgs) .Net框架里边提供的一个委托EventHandler来Handle事件. 一样,搞一个场景(这个场景是书里的):买车.经销商(CarDealer)会上新车(NewCa ...

  4. C#多线程の遇见长耗时操作以及多任务(简明记要)

    4.0用         Task.Factory.StartNew(()=>{});4.0以下用  ThreadPool.QueueUserWorkItem(()=>{})4.0以上用 ...

  5. UVA225-Golygons(dfs)

    Problem UVA225-Golygons Accept:307  Submit:3646 Time Limit: 3000 mSec  Problem Description Imagine a ...

  6. 洛谷P2982 [USACO10FEB]慢下来Slowing down

    题目 题目大意 :给出一棵树,节点有点权,求每个节点的祖先中点权小于该节点的结点的个数 . 思路如下 : 从根节点开始,对树进行深度优先遍历. 当进行到节点 i 时,有: $\text{i}$ ​的祖 ...

  7. P1101 单词方阵 (单词方阵)

    思路:就是白白的模拟 #include<iostream> using namespace std; ][]; ][]; char kk[] = "yizhong"; ...

  8. 【转】理解WebKit和Chromium: JavaScript引擎简介

    转载请注明原文地址:http://blog.csdn.net/milado_nju1. 什么是JavaScript引擎什么是JavaScript引擎?简单来讲,就是能够提供执行JavaScript代码 ...

  9. Linux:Day5 shell编程初步、grep

    bash的基本特性(3) 1.提供了编程环境 程序编程风格: 过程式:以指令为中心,数据服务于指令: 对象式:以数据为中心,指令服务于数据: shell程序:提供了编程能力,解释执行:过程式.解释执行 ...

  10. 【转】从零开始玩转logback

    概述 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)下载地址:http://l ...