菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
115
0

MySQL 日期计算

原创
05/13 14:22
阅读数 54460

MySQL提供了几个函数,可以用来计算日期,常用的例子就是,计算年龄提取日期部分

1. 计算年龄:

mysql中要想计算一个人的年龄,相当于当前日期的年和出生日期之间的差。如果当前日期的日历年比出生日期早,则减去一年。

通过以下查询来显示出生日期当前日期年龄数值的年数字。

SELECT name, birth, CURDATE(),    
 (YEAR(CURDATE())-YEAR(birth))    
 - (RIGHT(CURDATE(),5)<RIGHT(birth,5))    
AS age    
FROM pet; 

结果:

复制代码
+----------+------------+------------+------+
| name      | birth       | CURDATE()   | age   |
+----------+------------+------------+------+
| Fluffys   | 1993-02-04 | 2009-10-28 |    10 |
| Claws     | 1994-03-17 | 2009-10-28 |     9 |
| Buffy     | 1989-05-13 | 2009-10-28 |    14 |
| Fang      | 1990-08-27 | 2009-10-28 |    12 |
| Bowser    | 1989-08-31 | 2009-10-28 |    13 |
| Chirpy    | 1998-09-11 | 2009-10-28 |     4 |
| Whistler | 1997-12-09 | 2009-10-28 |     5 |
| Slim      | 1996-04-29 | 2009-10-28 |     7 |
| Puffball | 1999-03-30 | 2009-10-28 |     4 |
+----------+------------+------------+------+ 
复制代码

函数解释:

此处,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日历年)部分的最右面5个字符。比较MM-DD值的表达式的结果值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。(这个比较表达式需要理解一下)。

(1). 尽管查询可行,如果以某个顺序排列行,则能更容易地浏览结果。添加ORDER BY name子句按照名字对输出进行排序则能够实现.

复制代码
 SELECT name, birth, CURDATE(),

(YEAR(CURDATE())-YEAR(birth))

 - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
AS age
FROM pet ORDER BY name;

+----------+------------+------------+------+

| name     | birth      | CURDATE()  | age  |

+----------+------------+------------+------+

| Bowser   | 1989-08-31 | 2003-08-19 |   13 |

| Buffy    | 1989-05-13 | 2003-08-19 |   14 |

| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| Claws    | 1994-03-17 | 2003-08-19 |    9 |

| Fang     | 1990-08-27 | 2003-08-19 |   12 |

| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| Puffball | 1999-03-30 | 2003-08-19 |    4 |

| Slim     | 1996-04-29 | 2003-08-19 |    7 |

| Whistler | 1997-12-09 | 2003-08-19 |    5 |

+----------+------------+------------+------+
复制代码

(2). 为了按age而非name排序输出,只要再使用一个ORDER BY子句:

复制代码
SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth))

 - (RIGHT(CURDATE(),5)<RIGHT(birth,5))

AS age
FROM pet ORDER BY age;

+----------+------------+------------+------+

| name     | birth      | CURDATE()  | age  |

+----------+------------+------------+------+

| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| Puffball | 1999-03-30 | 2003-08-19 |    4 |

| Whistler | 1997-12-09 | 2003-08-19 |    5 |

| Slim     | 1996-04-29 | 2003-08-19 |    7 |

| Claws    | 1994-03-17 | 2003-08-19 |    9 |

| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| Fang     | 1990-08-27 | 2003-08-19 |   12 |

| Bowser   | 1989-08-31 | 2003-08-19 |   13 |

| Buffy    | 1989-05-13 | 2003-08-19 |   14 |

+----------+------------+------------+------+
复制代码

(3). 可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否是NULL来确定是哪些动物,然后,对于那些非NULL值的动物,需要计算出deathbirth值之间的差:

复制代码
SELECT name, birth, death,

(YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))

AS age
FROM pet WHERE death IS NOT NULL ORDER BY age;

+--------+------------+------------+------+

| name   | birth      | death      | age  |

+--------+------------+------------+------+

| Bowser | 1989-08-31 | 1995-07-29 |    5 |

+--------+------------+------------+------+
复制代码

解析:查询使用death IS NOT NULL而非death != NULL,因为NULL是特殊的值,不能使用普通比较符来比较,以后会给出解释。参见3.3.4.6节,“NULL值操作

(4). 如果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期部分的提取函数,例如YEAR( )MONTH( )DAYOFMONTH( )。在这里MONTH()是适合的函数。为了看它怎样工作,运行一个简单的查询,显示birthMONTH(birth)的值:

复制代码
SELECT name, birth, MONTH(birth) FROM pet;

+----------+------------+--------------+

| name     | birth      | MONTH(birth) |

+----------+------------+--------------+

| Fluffy   | 1993-02-04 |            2 |

| Claws    | 1994-03-17 |            3 |

| Buffy    | 1989-05-13 |            5 |

| Fang     | 1990-08-27 |            8 |

| Bowser   | 1989-08-31 |            8 |

| Chirpy   | 1998-09-11 |            9 |

| Whistler | 1997-12-09 |           12 |

| Slim     | 1996-04-29 |            4 |

| Puffball | 1999-03-30 |            3 |

+----------+------------+--------------+
复制代码

(5). 找出下个月生日的动物也是容易的。假定当前月是4月,那么月值是4你可以找在5月出生的动物 (5),方法是:

复制代码
 ELECT name, birth FROM pet WHERE MONTH(birth) = 5;

+-------+------------+

| name  | birth      |

+-------+------------+

| Buffy | 1989-05-13 |

+-------+------------+
复制代码

解析:如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物(1)

(6). 你甚至可以编写查询,不管当前月份是什么它都能工作。采用这种方法不必在查询中使用一个特定的月份,DATE_ADD( )允许在一个给定的日期上加上时间间隔。如果在NOW( )值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份:

复制代码
SELECT name, birth FROM pet
WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

完成该任务的另一个方法是加1以得出当前月份的下一个月(在使用取模函数(MOD)后,如果月份当前值是12,则“回滚”到值0):

SELECT name, birth FROM pet
WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD( )以后加1,否则我们将从11月( 11 )跳到1月(1)。
复制代码
 
 
 
2、查询今天、昨天、7天、近30天、本月、上一月 数据
#今天
select * from 表名 where to_days(时间字段名) = to_days(now());

#昨天
SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) – TO_DAYS( 时间字段名) <= 1

#7天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(时间字段名)

#近30天
SELECT * FROM 表名 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(时间字段名)

#本月
SELECT * FROM 表名 WHERE DATE_FORMAT( 时间字段名, ‘%Y%m’ ) = DATE_FORMAT( CURDATE( ) , ‘%Y%m’ )

#上一月
SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , ‘%Y%m’ ) , date_format( 时间字段名, ‘%Y%m’ ) ) =1

 

参考:

MySQL提供了几个函数,可以用来计算日期,常用的例子就是,计算年龄提取日期部分

1. 计算年龄:

mysql中要想计算一个人的年龄,相当于当前日期的年和出生日期之间的差。如果当前日期的日历年比出生日期早,则减去一年。

通过以下查询来显示出生日期当前日期年龄数值的年数字。

SELECT name, birth, CURDATE(),    
 (YEAR(CURDATE())-YEAR(birth))    
 - (RIGHT(CURDATE(),5)<RIGHT(birth,5))    
AS age    
FROM pet; 

结果:

复制代码
+----------+------------+------------+------+
| name      | birth       | CURDATE()   | age   |
+----------+------------+------------+------+
| Fluffys   | 1993-02-04 | 2009-10-28 |    10 |
| Claws     | 1994-03-17 | 2009-10-28 |     9 |
| Buffy     | 1989-05-13 | 2009-10-28 |    14 |
| Fang      | 1990-08-27 | 2009-10-28 |    12 |
| Bowser    | 1989-08-31 | 2009-10-28 |    13 |
| Chirpy    | 1998-09-11 | 2009-10-28 |     4 |
| Whistler | 1997-12-09 | 2009-10-28 |     5 |
| Slim      | 1996-04-29 | 2009-10-28 |     7 |
| Puffball | 1999-03-30 | 2009-10-28 |     4 |
+----------+------------+------------+------+ 
复制代码

函数解释:

此处,YEAR()提取日期的年部分,RIGHT()提取日期的MM-DD (日历年)部分的最右面5个字符。比较MM-DD值的表达式的结果值一般为1或0,如果CURDATE()的年比birth的年早,则年份应减去1。(这个比较表达式需要理解一下)。

(1). 尽管查询可行,如果以某个顺序排列行,则能更容易地浏览结果。添加ORDER BY name子句按照名字对输出进行排序则能够实现.

复制代码
 SELECT name, birth, CURDATE(),

(YEAR(CURDATE())-YEAR(birth))

 - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
AS age
FROM pet ORDER BY name;

+----------+------------+------------+------+

| name     | birth      | CURDATE()  | age  |

+----------+------------+------------+------+

| Bowser   | 1989-08-31 | 2003-08-19 |   13 |

| Buffy    | 1989-05-13 | 2003-08-19 |   14 |

| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| Claws    | 1994-03-17 | 2003-08-19 |    9 |

| Fang     | 1990-08-27 | 2003-08-19 |   12 |

| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| Puffball | 1999-03-30 | 2003-08-19 |    4 |

| Slim     | 1996-04-29 | 2003-08-19 |    7 |

| Whistler | 1997-12-09 | 2003-08-19 |    5 |

+----------+------------+------------+------+
复制代码

(2). 为了按age而非name排序输出,只要再使用一个ORDER BY子句:

复制代码
SELECT name, birth, CURDATE(),
(YEAR(CURDATE())-YEAR(birth))

 - (RIGHT(CURDATE(),5)<RIGHT(birth,5))

AS age
FROM pet ORDER BY age;

+----------+------------+------------+------+

| name     | birth      | CURDATE()  | age  |

+----------+------------+------------+------+

| Chirpy   | 1998-09-11 | 2003-08-19 |    4 |

| Puffball | 1999-03-30 | 2003-08-19 |    4 |

| Whistler | 1997-12-09 | 2003-08-19 |    5 |

| Slim     | 1996-04-29 | 2003-08-19 |    7 |

| Claws    | 1994-03-17 | 2003-08-19 |    9 |

| Fluffy   | 1993-02-04 | 2003-08-19 |   10 |

| Fang     | 1990-08-27 | 2003-08-19 |   12 |

| Bowser   | 1989-08-31 | 2003-08-19 |   13 |

| Buffy    | 1989-05-13 | 2003-08-19 |   14 |

+----------+------------+------------+------+
复制代码

(3). 可以使用一个类似的查询来确定已经死亡动物的死亡年龄。你通过检查death值是否是NULL来确定是哪些动物,然后,对于那些非NULL值的动物,需要计算出deathbirth值之间的差:

复制代码
SELECT name, birth, death,

(YEAR(death)-YEAR(birth)) - (RIGHT(death,5)<RIGHT(birth,5))

AS age
FROM pet WHERE death IS NOT NULL ORDER BY age;

+--------+------------+------------+------+

| name   | birth      | death      | age  |

+--------+------------+------------+------+

| Bowser | 1989-08-31 | 1995-07-29 |    5 |

+--------+------------+------------+------+
复制代码

解析:查询使用death IS NOT NULL而非death != NULL,因为NULL是特殊的值,不能使用普通比较符来比较,以后会给出解释。参见3.3.4.6节,“NULL值操作

(4). 如果你想要知道哪个动物下个月过生日,怎么办?对于这类计算,年和天是无关的,你只需要提取birth列的月份部分。MySQL提供几个日期部分的提取函数,例如YEAR( )MONTH( )DAYOFMONTH( )。在这里MONTH()是适合的函数。为了看它怎样工作,运行一个简单的查询,显示birthMONTH(birth)的值:

复制代码
SELECT name, birth, MONTH(birth) FROM pet;

+----------+------------+--------------+

| name     | birth      | MONTH(birth) |

+----------+------------+--------------+

| Fluffy   | 1993-02-04 |            2 |

| Claws    | 1994-03-17 |            3 |

| Buffy    | 1989-05-13 |            5 |

| Fang     | 1990-08-27 |            8 |

| Bowser   | 1989-08-31 |            8 |

| Chirpy   | 1998-09-11 |            9 |

| Whistler | 1997-12-09 |           12 |

| Slim     | 1996-04-29 |            4 |

| Puffball | 1999-03-30 |            3 |

+----------+------------+--------------+
复制代码

(5). 找出下个月生日的动物也是容易的。假定当前月是4月,那么月值是4你可以找在5月出生的动物 (5),方法是:

复制代码
 ELECT name, birth FROM pet WHERE MONTH(birth) = 5;

+-------+------------+

| name  | birth      |

+-------+------------+

| Buffy | 1989-05-13 |

+-------+------------+
复制代码

解析:如果当前月份是12月,就有点复杂了。你不能只把1加到月份数(12)上并寻找在13月出生的动物,因为没有这样的月份。相反,你应寻找在1月出生的动物(1)

(6). 你甚至可以编写查询,不管当前月份是什么它都能工作。采用这种方法不必在查询中使用一个特定的月份,DATE_ADD( )允许在一个给定的日期上加上时间间隔。如果在NOW( )值上加上一个月,然后用MONTH()提取月份,结果产生生日所在月份:

复制代码
SELECT name, birth FROM pet
WHERE MONTH(birth) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH));

完成该任务的另一个方法是加1以得出当前月份的下一个月(在使用取模函数(MOD)后,如果月份当前值是12,则“回滚”到值0):

SELECT name, birth FROM pet
WHERE MONTH(birth) = MOD(MONTH(CURDATE()), 12) + 1;

注意,MONTH返回在1和12之间的一个数字,且MOD(something,12)返回在0和11之间的一个数字,因此必须在MOD( )以后加1,否则我们将从11月( 11 )跳到1月(1)。
复制代码
 

发表评论

0/200
115 点赞
0 评论
收藏