- 浏览: 472402 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chexiazi:
一样的xml代码 报这个错 <ns1:XMLFault ...
CXF 通过用户名和密码进行验证 -
di1984HIT:
谢谢啊 ~~~
通过JavaCompiler进行编译java文件(转载) -
aa00aa00:
'%${userName}%' 这种是可以的,是可以模糊查询的 ...
mybatis 模糊查询 -
一棵杨柳的地盘:
我把你的代码不了一遍 但是汇报错首先:static { ...
CXF 通过用户名和密码进行验证 -
shangmin1990:
转 IntelliJ IDEA 编辑器生成 Hibernate 实体映射文件
项目中的统计报表作的很多,需求中有按周、月统计数据的。查看了Mysql的API,发现Date_format是格式化日期的,看了Date_format()的具体说明后就用这个函数按周统计,sql大致如下:
select DATE_FORMAT(check_date ,'%X-%V') dates,avg(weight)/10000 weight from ho_body where user_id=295
and weight >0 and check_date between '2009-02-24' and '2010-02-24' group by dates
------------------------------------------------------------------------------------------------------
查出的结果为:
dates weight
2009-30 80.9
2009-31 80.425
2009-32 80.76666667
2009-33 80.75384615
2009-34 80.8
2009-35 79.88
2009-36 80.06
2009-37 79.875
2009-3879.075
2009-39 79.26666667
2009-40 79.16666667
2009-41 78.875
2009-42 78.33333333
2009-43 78.77272727
2009-44 77.625
2009-45 77.825
2009-46 77.575
2009-47 77.45
2009-48 81.25
2009-49 76.5
2009-50 77.83333333
2009-52 79.8
2010-02 79.2
%X |
年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x |
年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y |
年,4 位 |
%y |
年,2 位 |
难道%X只能与%V一起用表示年-周,并且周日为一周开始,
%x与%v一起用,表示年-周,周一为一周开始?
再看到前面的
%V |
周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v |
周 (01-53) 星期一是一周的第一天,与 %x 使用 |
看来是这个意思了,我之前怎么就没有注意到这个特别之处呢?可能是当时作完以周统计,然后再写月统计时,一看m表示月,数值,就直接把Date_format('%X-%V')改为Date_format('%X-%m')了。再加上%Y年,4位,%m月,没有具体说明,所以一直没有发现,并且用%X-%m按月统计,测试了许多数据,发现年-月,数值全是正确的。结果在跨年的情况下有问题了。。。一般情况下我是会考虑跨年的情况的,比如在求一个日期属于这一年的第几周,在这个问题上,我测试2009-12-31,2010-01-01属于哪一周,2010-01-03是哪一周,发现之前的方法有bug,后来作了修正才正确。而这是用mysql函数统计,测试一些数据没问题就觉得ok了,根本没有想到这样写在跨年时有问题了。。。。
为了将这个问题彻底整理清楚,下面是我找到的详细解读:
Date_format可以使用的格式有:
格式 |
描述 |
%a |
缩写星期名 |
%b |
缩写月名 |
%c |
月,数值 |
%D |
带有英文前缀的月中的天 |
%d |
月的天,数值(00-31) |
%e |
月的天,数值(0-31) |
%f |
微妙 |
%H |
小时 (00-23) |
%h |
小时 (01-12) |
%I |
小时 (01-12) |
%i |
分钟,数值(00-59) |
%j |
年的天 (001-366) |
%k |
小时 (0-23) |
%l |
小时 (1-12) |
%M |
月名 |
%m |
月,数值(00-12) |
%p |
AM 或 PM |
%r |
时间,12-小时(hh:mm:ss AM 或 PM) |
%S |
秒(00-59) |
%s |
秒(00-59) |
%T |
时间, 24-小时 (hh:mm:ss) |
%U |
周 (00-53) 星期日是一周的第一天 |
%u |
周 (00-53) 星期一是一周的第一天 |
%V |
周 (01-53) 星期日是一周的第一天,与 %X 使用 |
%v |
周 (01-53) 星期一是一周的第一天,与 %x 使用 |
%W |
星期名 |
%w |
周的天 (0=星期日, 6=星期六) |
%X |
年,其中的星期日是周的第一天,4 位,与 %V 使用 |
%x |
年,其中的星期一是周的第一天,4 位,与 %v 使用 |
%Y |
年,4 位 |
%y |
年,2 位 |
Mysql中还有另外几种返回日期的函数,如:
SELECT EXTRACT(YEAR_MONTH FROM datecolum ) 返回格式如200902
EXTRACT() 函数用于返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
语法
EXTRACT(unit FROM date)
date 参数是合法的日期表达式。unit 参数可以是下列的值:
Unit 值 MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH
Unit 值 |
MICROSECOND |
SECOND |
MINUTE |
HOUR |
DAY |
WEEK |
MONTH |
QUARTER |
YEAR |
SECOND_MICROSECOND |
MINUTE_MICROSECOND |
MINUTE_SECOND |
HOUR_MICROSECOND |
HOUR_SECOND |
HOUR_MINUTE |
DAY_MICROSECOND |
DAY_SECOND |
DAY_MINUTE |
DAY_HOUR |
YEAR_MONTH |
检查了一下,大致没有问题,然后又开始寻找如何按月统计,然后就看Date_format的语法,
%m表示数值,%M表示名称,看后很兴奋的试一下:
select distinct DATE_FORMAT(check_date ,'%X-%m') c1,avg(weight)/10000 wei from ho_body where user_id=295
and weight >0 and check_date between '2009-02-24' and '2009-10-31' group by c1
——————————————————————————————————————
c1 wei
2009-08 80.66388889
2009-09 79.70555556
2009-10 78.83714286
然后测试这样计算的结果是否正确,经过测试,果然是没问题的,很有成就感。然后就用这个方法统计,拿取数据,然后将这些统计的结果作为数据集,用JfreeChart画图。后期测试时,发现画的统计图横轴日期有问题,时间范围为2009-02-24~2010-02-24时,图片中竟然多出一个2009年1月,并且在最右侧。我确信我是经过排序的,不可能2009年1月会在最右侧,之后再调试,竟然发现数据库中根本就没有09年1月的数据,更直观的错误是,以between '2009-02-24' and '2009-10-31' 条件,根本不可能出现2009-01。
然后将错误原因定位在sql语句上,执行这个语句,果然,原因就在这里:
select distinct DATE_FORMAT(check_date ,'%X-%m') c1,avg(weight)/10000 wei from ho_body where user_id=295
and weight >0 and check_date between '2009-02-24' and '2010-02-24' group by c1
————————————————————————————————————————
c1 wei
2009-01 79.8
2009-08 80.66388889
2009-09 79.70555556
2009-10 78.83714286
2009-11 77.64285714
2009-12 78.75
2010-01 79.2
这个09年1月到底是哪里出来的,我先确定2009年1月是否有数据,结果测试最早的数据为2009-08-01,并没有1月的任何数据。既然最早的数据是8月,那么就测试这个多出来的2009-01是从哪里冒出来的。
我就用最笨的方法测试:
select distinct DATE_FORMAT(check_date ,'%X-%m')c1 from ho_body where user_id=295 and check_date between '2009-08-01' and '2009-08-31' order by c1
————————————————————————————————————————
c1
2009-08
问题不在8月。继续测试:
select distinct DATE_FORMAT(check_date ,'%X-%m')c1 from ho_body where user_id=295 and check_date between '2009-9-01' and '2009-09-30' order by c1
——————————————————————————————————————
c1
2009-09
……
……
直到2010年时,
select distinct DATE_FORMAT(check_date ,'%X-%m')c1 from ho_body where user_id=295 and check_date between '2010-01-01' and '2010-01-31' order by c1
————————————————————————————————————————
c1
2009-01
2010-01
问题就是2010年1月,并且,如果将条件改为between '2010-01-02' and '2010-01-31' 则不会多出2009-01。难道是Date_format函数有bug,在跨年时没有考虑正确,将2010年1月1日归为2009年的1月中?当然我也有怀疑过是我的sql语句有问题,仔细再看了看Date_format()的语法,
%X表示年,周日为一周第一天
%x表示年,周一为一周第一天
%M表示月,名称
%m表示月,数值,01形式
%V表示周,周日为第一天
%v表示周,周一为第一天
...........
看来看去,感觉没什么错误呀,感觉自己对这个研究的够清楚明白了,一定没有问题的。
mysql有bug的想法我坚持了一下午,在我和一个同事说这个bug的时候,老大听到了,问我具体怎么回事,我就给她讲解,特别奇怪的地方在于数据库根本没有09年1月的数据,用mysql中的Date_format的按月统计函数时,在跨年时有问题。老大也觉得这个问题不可思议,这时那个同事说,你怎么用X表示年呀,一般不都是有Y表示年吗?我还反驳说,这个没区别的呀,都是一样的,表示年嘛,4位的。。。。
后
发表评论
-
(转)SQLServer行列转换 Pivot UnPivot
2012-10-17 14:38 3271PIVOT用于将列值旋转为列名(即行转列),在SQL Serv ... -
SQL中使用WITH AS提高性能-使用公用表表达式(CTE)简化嵌套SQL
2012-01-18 14:57 1154SQL中使用WITH AS提高性能-使用公用表表达式 ... -
mybatis 模糊查询
2012-01-05 18:03 3297使用数据库查询数据的时候,绝对会用到like进行模糊查询的,但 ... -
ibatis 入门
2011-12-28 12:48 1277昨天学习了一下ibatis ... -
转 JTA简介
2011-12-26 17:47 1072Java Transaction API(Java事务 ... -
数据库 left join,right join,inner join用法举例
2011-11-30 16:30 1445现有A和B两个表表A记录如下: aID aNu ... -
sql Server like 匹配符的介绍
2011-04-27 14:18 2827like关键字是一个匹配预算符,它与字符串表达式相匹配,字符串 ... -
sql Server varchar和nvarchar的区别
2011-04-11 11:16 1656SQL Server中字符串的存储 ... -
sql in
2009-02-25 10:32 1096在 SQL 中,在两个情况下会用到 IN 这个指令;这一页将介 ... -
sql like
2009-02-25 10:37 975LIKE 是另一个在 WHERE 子句中会用到的指令。基本上, ... -
order by
2009-02-25 10:52 991到目前为止,我们已 ... -
count 函数
2009-02-25 10:58 980COUNT 是函数之一。由于它的使用广泛,我们在这里特别提出来 ... -
group by
2009-02-25 11:04 1063我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 ... -
having 子句
2009-02-25 11:09 942那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要 ... -
内连接
2009-02-25 11:23 931现在我们介绍连接(join)的概念。要了解连接,我们需要用到许 ... -
外链接
2009-02-25 11:31 831之前我们看到的左连接 (left join),又称内部连接 ( ... -
subquery 框架
2009-02-25 11:39 966我们可以在一个 SQL 语句中放入另一个 SQL 语句。当我们 ... -
UNION
2009-02-25 11:56 1109UNION 指令的目的是将两个 SQL 语句的结果合并起来。从 ... -
Union all
2009-02-25 12:10 1139UNION ALL 这个指令的目的也是要将两个 SQL 语句的 ... -
sql 中Intersect
2009-02-25 12:15 1416和 UNION 指令类似, INTERSECT 也是对两个 S ...
相关推荐
您可能感兴趣的文章:MySQL中日期比较时遇到的编码问题解决办法PHP以及MYSQL日期比较方法mysql 获取当前日期函数及时间格式化参数详解mysql unix准换时间格式查找指定日期数据代码MySql日期查询语句详解深入mysql ...
在MySQL中,DATE_FORMAT函数是一个非常实用的日期时间格式化工具,它允许用户根据自定义的格式来展示日期和时间数据。然而,在实际使用中,DATE_FORMAT函数有一些需要注意的细节,尤其是在涉及到字符集和校对集...
首先,手册中的"函数"部分会详细介绍如何在SQL查询中使用这些函数来处理数据。函数大致可以分为以下几类: 1. 数学函数:例如ABS()用于计算绝对值,SQRT()用于求平方根,RAND()用于生成随机数,以及一系列的三角...
DATE_FORMAT 函数使得在 MySQL 查询中处理日期和时间变得更加方便,无论是在报表中呈现数据,还是在用户界面中展示日期,都能提供极大的灵活性。记得在实际应用中,根据具体需求选择合适的格式符,以达到最佳的显示...
本文转自:http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html#function_date-format DATE_FORMAT(date,format) Formats the date value according to the format string. The following ...
描述中提到的"DATE_FORMAT时间Sql比较"和"for循环+hashmap"则暗示了这个资源可能涉及到SQL查询中处理日期的技巧,以及在编程(可能是Java)中使用for循环和HashMap的数据结构。 在SQL中,`DATE_FORMAT`函数是MySQL...
### Oracle中的TO_DATE和TO_CHAR函数详解 #### 一、TO_DATE函数 **TO_DATE**函数主要用于将字符串转换成日期格式。在Oracle数据库中,这是一个非常实用的功能,尤其是在处理日期和时间相关的数据时。 ##### 1. ...
按月统计则相对简单,只需使用`MONTH([date])`: ```sql SELECT SUM(consume), MONTH([date]) FROM consume_record WHERE YEAR([date]) = '2006' GROUP BY MONTH([date]); ``` 对于季度统计,我们可以结合`...
文章目录SQL Date 函数MySQL Date 函数NOW() 函数CURDATE() 函数CURTIME() 函数DATE() 函数EXTRACT() 函数DATE_ADD() 函数DATE_SUB() 函数DATEDIFF() 函数DATE_FORMAT() 函数SQL Server Date 函数GETDATE() 函数...
### MySQL 实现一天24小时数据统计并默认补0的方法 在进行数据分析时,我们经常会遇到需要统计一天内每个小时的数据情况。为了确保统计数据的完整性,对于那些在某小时内无记录的情况,通常需要将该小时的数据设为0...
如果需要查询过去六个月内的数据,可以使用`BETWEEN`和`DATE_SUB`函数来实现: ```sql SELECT name, submittime FROM enterprise WHERE submittime BETWEEN date_sub(now(), INTERVAL 6 MONTH) AND now(); ``` 这里`...
MySQL 中日期时间的格式可以使用 DATE_FORMAT 函数来格式化。例如,使用 `SELECT DATE_FORMAT(NOW(), '%Y%m%d%H%i%S')` 可以获取当前时间的年月日时分秒格式。 日期时间运算 MySQL 中可以使用 DATE_ADD 和 DATE_...
再来说说`DATE_FORMAT`函数,它是MySQL中用于格式化日期时间的函数。`DATE_FORMAT(sch.create_time, '%Y-%m-%d %H:%i:%s') as createtime`这一句将`sch.create_time`的时间戳转换成"年-月-日 时:分:秒"的格式,使...
查询上个月的数据可以使用 `DATE_SUB()` 函数来从当前日期减去一个月的时间跨度,再使用 `DATE_FORMAT()` 函数提取月份信息。SQL 语句如下: ```sql SELECT name, submittime FROM enterprise WHERE DATE_FORMAT...
MySql 中的 DATE_FORMAT 函数相当于 Oracle 中的 TO_CHAR 函数。MySql 中的 STR_TO_DATE 函数相当于 Oracle 中的 TO_DATE 函数。 11. 回车符、换行符 MySql 中的 CHAR(10) 等同于 Oracle 中的 CHR(10),CHAR(13) ...
在MySQL数据库中,处理日期和时间是常见的任务,特别是在数据分析和报表生成中。本文将深入探讨两个关键的函数类别:时间差函数和日期转换计算函数,以帮助理解如何有效地进行日期和时间操作。 1. **时间差函数**:...
### MySQL日期函数总结 在MySQL数据库管理中,处理日期与时间是常见的需求之一。通过使用各种日期函数,我们可以实现对日期进行格式化、计算日期...希望这篇总结能帮助你在实际工作中更高效地使用MySQL的日期函数。