时间差计算函数
PERIOD_DIFF(P1,P2)
返回周期P1和 P2 之间的月份数。P1和P2 的格式应该为YYMM或YYYYMM。注意周期参数 P1和P2不是日期值。
mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
DATEDIFF(expr,expr2)
DATEDIFF() 返回起始时间 expr和结束时间expr2之间的天数。Expr和expr2为日期或 date-and-time 表达式。计算中只用到这些值的日期部分。
mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
-> 1
mysql> SELECT DATEDIFF('1997-11-30 23:59:59','1997-12-31');
-> -31
TIMEDIFF(expr,expr2)
TIMEDIFF() 返回起始时间 expr 和结束时间expr2之间的时间。 expr 和expr2 为时间或date-and-time 表达式,两个的类型必须一样。
mysql> SELECT TIMEDIFF('2000:01:01 00:00:00',
-> '2000:01:01 00:00:00.000001');
-> '-00:00:00.000001'
TIMESTAMPDIFF(interval, datetime_expr1, datetime_expr2)
返回日期或日期时间表达式datetime_expr1和datetime_expr2the 之间的整数差。其结果的单位由interval参数给出。interval的法定值同TIMESTAMPADD()函数说明中所列出的相同。
mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
-> 3
mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
-> -1
其它日历相关信息获取
DAYNAME(date)
返回date对应的工作日名称,如‘周四’。
DAYOFWEEK(date)
返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)对应的工作日索引。这些索引值符合 ODBC标准。
WEEKDAY(date)
返回date (0 = 周一, 1 = 周二, ... 6 = 周日)对应的工作日索引 weekday index for
mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1
mysql> SELECT WEEKDAY('1997-11-05');
-> 2
WEEKOFYEAR(date)
将该日期的阳历周以数字形式返回,范围是从1到53。它是一个兼容度函数,相当于WEEK(date,3)。
mysql> SELECT WEEKOFYEAR('1998-02-20');
-> 8
LAST_DAY(date)
获取一个日期或日期时间值,返回该月最后一天对应的值。若参数无效,则返回NULL。
mysql> SELECT LAST_DAY('2003-02-05');
-> '2003-02-28'
MONTHNAME(date)
返回date对应月份的全名。
mysql> SELECT MONTHNAME('1998-02-05');
-> 'February '
QUARTER(date)
返回date对应的一年中的季度值,范围是从 1到 4。
mysql> SELECT QUARTER('98-04-01');
-> 2
WEEK(date[,mode])
该函数返回date对应的星期数。WEEK() 的双参数形式允许你指定该星期是否起始于周日或周一, 以及返回值的范围是否为从0 到53 或从1 到53。若 mode参数被省略,则使用default_week_format系统自变量的值。
以下表说明了mode参数的工作过程:d
第一天 | |||
Mode | 工作日 | 范围 | Week 1 为第一周 ... |
0 | 周日 | 0-53 | 本年度中有一个周日 |
1 | 周一 | 0-53 | 本年度中有3天以上 |
2 | 周日 | 1-53 | 本年度中有一个周日 |
3 | 周一 | 1-53 | 本年度中有3天以上 |
4 | 周日 | 0-53 | 本年度中有3天以上 |
5 | 周一 | 0-53 | 本年度中有一个周一 |
6 | 周日 | 1-53 | 本年度中有3天以上 |
7 | 周一 | 1-53 | 本年度中有一个周一 |
mysql> SELECT WEEK('1998-02-20');
-> 7
mysql> SELECT WEEK('1998-02-20',0);
-> 7
mysql> SELECT WEEK('1998-02-20',1);
-> 8
mysql> SELECT WEEK('1998-12-31',1);
-> 53
注意,假如有一个日期位于前一年的最后一周, 若你不使用2、3、6或7作为mode参数选择,则MySQL返回 0:
mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
有人或许会提出意见,认为MySQL 对于WEEK() 函数应该返回 52 ,原因是给定的日期实际上发生在1999年的第52周。我们决定返回0作为代替的原因是我们希望该函数能返回“给定年份的星期数”。这使得WEEK() 函数在同其它从日期中抽取日期部分的函数结合时的使用更加可靠。
假如你更希望所计算的关于年份的结果包括给定日期所在周的第一天,则应使用 0、2、5或7 作为mode参数选择。
mysql> SELECT WEEK('2000-01-01',2);
-> 52
作为选择,可使用YEARWEEK()函数:
mysql> SELECT YEARWEEK('2000-01-01');
-> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
-> '52'
YEARWEEK(date), YEARWEEK(date,start)
返回一个日期对应的年或周。start参数的工作同 start参数对 WEEK()的工作相同。结果中的年份可以和该年的第一周和最后一周对应的日期参数有所不同。
mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
注意,周数和WEEK()函数队可选参数0或1可能会返回的(0) w有所不同,原因是此时WEEK() 返回给定年份的语境中的周。
出处:http://liheanyway007.blog.163.com/blog/static/181773148201271343819682