`

mysql 时间格式化

阅读更多

 格式化时间例子:

date_format(now(),'%y-%m-%d %H:%i:%S')

 

项目中的统计报表作的很多,需求中有按周、月统计数据的。查看了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-38   79.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

 

检查了一下,大致没有问题,然后又开始寻找如何按月统计,然后就看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位的。。。。

后来和他争论之中,为了表明修改这个X,Y什么的没效果,我就改成了%Y-%m,结果却是2009-01没有了!!!!

怎么会这样????也太低级了吧,之前一直怀疑mysql的bug,竟然是这个原因?然后再仔细看Date_format()的语法,看后快晕过去了,这么低级的错误我怎么之前一直没有发现呢?

 

%M

月名

%m

月,数值(00-12)

 

 

%X

年,其中的星期日是周的第一天,4 位,与 %V 使用

%x

年,其中的星期一是周的第一天,4 位,与 %v 使用

%Y

年,

%y

年,

 

难道%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

年,其中的星期日是周的第一天,位,与 %V 使用

%x

年,其中的星期一是周的第一天,位,与 %v 使用

%Y

年,

%y

年,

 

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

 

分享到:
评论

相关推荐

    MySQL时间日期格式化

    ### MySQL时间日期格式化知识点详解 #### 一、概述 MySQL作为一款广泛使用的数据库管理系统,提供了丰富的日期和时间处理函数,使得开发人员能够方便地进行日期时间的数据操作。本文将重点介绍MySQL中与时间日期...

    mysql中格式化日期详解

    本文将深入探讨两种重要的日期格式化函数:`DATE_FORMAT()` 和 `FROM_UNIXTIME()`,以及它们在处理日期和时间数据时的应用。 1. `DATE_FORMAT()` 函数是MySQL中用于格式化日期和时间数据的工具。它接受两个参数,即...

    MySql用DATE_FORMAT截取DateTime字段的日期值

    您可能感兴趣的文章:MySQL中日期比较时遇到的编码问题解决办法PHP以及MYSQL日期比较方法mysql 获取当前日期函数及时间格式化参数详解mysql unix准换时间格式查找指定日期数据代码MySql日期查询语句详解深入mysql ...

    bootstap-talbe日期格式化

    Bootstrap Table 是一个基于 ...整个流程涉及到了 MySQL 的日期存储、Spring MyBatis 的数据处理、前端的 Bootstrap Table 以及日期格式化库的使用。确保每个环节都正确配置和使用,你就能成功地实现日期的格式化显示。

    获取当前日期及格式化

    下面详细阐述如何在MySQL中获取当前日期以及如何进行日期格式化。 首先,MySQL中的获取当前日期和时间的函数是`NOW()`。这个函数返回当前的日期和时间,精确到秒。例如,当你执行`SELECT NOW();`时,你会得到如下...

    JAVA和MYsql时间格式格式

    本文将深入探讨 Java 和 MySQL 中的时间日期格式化,并提供实用的知识点,帮助开发者更好地理解和应用。 首先,Java 中的时间日期处理主要依赖于 `java.time` 包中的类,比如 `LocalDate`, `LocalTime`, `...

    详解mysql 获取当前日期及格式化

    在MySQL中,获取和格式化日期是数据库操作中常见的任务,尤其对于数据分析和报表生成至关重要。MySQL提供了多种函数来帮助用户处理日期和时间。这里我们将深入探讨如何利用`NOW()`和`DATE_FORMAT()`这两个主要的函数...

    mysql中格式化数字详解

    在MySQL中,对数字进行格式化是常见的需求,特别是在数据展示和报表生成时。本文将详细解析MySQL中用于数字格式化的几种方法。 首先,我们关注的是`FORMAT`函数。这个函数用于将数字格式化为类似‘#,###,###.##’的...

    mysql 日期和时间格式转换实现语句

    这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内: mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) – TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回日期...

    mysql 获取当前日期函数及时间格式化参数详解

    它接受两个参数:需要格式化的日期或时间字段,以及一个包含格式代码的字符串。下面是一些常用的格式化代码: - `%Y`:四位数字的年份,例如 `2023` - `%y`:两位数字的年份,例如 `23` - `%m`:两位数字的月份...

    Mysql格式化日期时间[归类].pdf

    Mysql格式化日期时间 DATE_FORMAT 函数是 Mysql 中的一个重要函数,用于格式化日期时间。该函数的语法为 DATE_FORMAT(date, format),其中 date 是要格式化的日期时间,format 是格式化的字符串。 在 format 字符...

    Python MySQL 日期时间格式化作为参数的操作

    本篇将深入探讨如何在Python中格式化日期时间并将其作为参数传递给MySQL查询。首先,理解MySQL中的日期时间格式至关重要。在示例中,`start_time` 字段存储的格式是 `2018-03-21 10:55:32`,这是一种标准的`YYYY-MM-...

    Mysql 时间模糊查询

    DATE_FORMAT函数用于格式化日期时间,常用于日期时间的比较。例如,查询生日在特定时间段内的会员: ```sql SELECT * FROM user WHERE DATE_FORMAT(birthday, '%m-%d') >= '06-03' AND DATE_FORMAT(birthday, '%m-%...

    thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结

    本文实例讲述了thinkphp5.1框架实现格式化mysql时间戳为日期的方式。分享给大家供大家参考,具体如下: 方式一 使用mysql函数FROM_UNIXTIME(unix_timestamp,format)直接转换 select FROM_UNIXTIME(o.create_time,'...

    mysql 各种格式判断

    通过以上三个自定义函数的实现,我们可以有效地在 MySQL 中对字符串进行格式判断,包括但不限于判断字符串是否全为汉字、是否为有效的日期格式以及是否全为数字等。这些函数的应用场景非常广泛,在数据清洗、格式...

    关于mysql数据库格式化简单介绍

    DATE_FORMA T(date, format) 根据格式串format 格式化日期或日期和时间值date,返回结果串。 可用DATE_FORMAT( ) 来格式化DATE 或DATETIME 值,以便得到所希望的格式。根据format字符串格式化date值: %S, %s 两位...

    python 带时区的日期格式化操作

    几种不同的日期格式化方式,不同的时区时间转换成北京时间,也就是东八区的时间,注意的是后面的时区表示方式, def getTimeStamp(self, date): result = re.search(r"[\-\+]\d+", date) if result:

    golang gorm中格式化时间问题详解

    本文主要探讨了如何在GORM中处理时间格式化的问题。 首先,GORM默认可以自动管理如`created_at`, `updated_at`, `deleted_at`这样的时间字段,但它们通常是按照数据库内部的时间格式存储的,而非我们期望的特定格式...

Global site tag (gtag.js) - Google Analytics