q里是一个用日期函数的例子。下面的查询选择所?date_col
值在最?30 天内的记录?
mysql> SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
-
DAYOFWEEK(date)
-
q回
date
的星期烦(ch)?1
= Sunday,2
= Monday, ...7
= Saturday)。烦(ch)引值符?ODBC 的标准?mysql> SELECT DAYOFWEEK('1998-02-03'); -> 3
-
WEEKDAY(date)
- q回
date
的星期烦(ch)?0
= Monday,1
= Tuesday, ...6
= Sunday)Q?mysql> SELECT WEEKDAY('1998-02-03 22:23:00'); -> 1 mysql> SELECT WEEKDAY('1997-11-05'); -> 2
-
DAYOFMONTH(date)
- q回
date
是一月中的第几天Q范围ؓ(f)1
?31
Q?mysql> SELECT DAYOFMONTH('1998-02-03'); -> 3
-
DAYOFYEAR(date)
- q回
date
是一q中的第几天Q范围ؓ(f)1
?366
Q?mysql> SELECT DAYOFYEAR('1998-02-03'); -> 34
-
MONTH(date)
- q回
date
中的月䆾Q范围ؓ(f)1
?12
Q?mysql> SELECT MONTH('1998-02-03'); -> 2
-
DAYNAME(date)
- q回
date
的星期名Q?mysql> SELECT DAYNAME("1998-02-05"); -> 'Thursday'
-
MONTHNAME(date)
- q回
date
的月份名Q?mysql> SELECT MONTHNAME("1998-02-05"); -> 'February'
-
QUARTER(date)
- q回
date
在一q中的季度,范围?1
?4
Q?mysql> SELECT QUARTER('98-04-01'); -> 2
-
WEEK(date)
-
WEEK(date,first)
- 对于星期日是一周中的第一天的场合Q如果函数只有一个参数调用,q回
date
Zq的W几周,q回D围ؓ(f)0
?53
(是的Q可能有W?53 周的开?。两个参数Ş式的WEEK()
允许你指定一周是否以星期日或星期一开始,以及(qing)q回gؓ(f)0-53
q是1-52
?q里的一个表昄W二个参数是如何工作的:(x)? 含义
0 一周以星期日开始,q回D围ؓ(f) 0-53 1 一周以星期一开始,q回D围ؓ(f) 0-53 2 一周以星期日开始,q回D围ؓ(f) 1-53 3 一周以星期一开始,q回D围ؓ(f) 1-53 (ISO 8601) 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
注意Q在版本 4.0 中,WEEK(#,0)
被更改ؓ(f)匚w USA 历法?注意Q如果一周是上一q的最后一周,当你没有使用 2 ?3 做ؓ(f)可选参数时QMySQL 返?0Q?mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0); -> 2000, 0 mysql> SELECT WEEK('2000-01-01',2); -> 52
你可能会(x)争辩_(d)当给定的日期值实际上?1999 q的W?52 周的一部分ӞMySQL ?WEEK()
函数应该q回52
。我们决定返?0 Q是因ؓ(f)我们希望该函数返回“在指定q䆾中是W几周”。当与其它的提取日期g的月日值的函数l合使用Ӟq?WEEK()
函数的用法可靠?如果你更希望能得到恰当的q?周|那么你应该用参?2 ?3 做ؓ(f)可选参敎ͼ或者用函?YEARWEEK()
Q?mysql> SELECT YEARWEEK('2000-01-01'); -> 199952 mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2); -> 52
-
YEAR(date)
- q回
date
的年份,范围?1000
?9999
Q?mysql> SELECT YEAR('98-02-03'); -> 1998
-
YEARWEEK(date)
-
YEARWEEK(date,first)
- q回一个日期值是的哪一q的哪一周。第二个参数的Ş式与作用完全?
WEEK()
的第二个参数一致。注意,对于l定的日期参数是一q的W一周或最后一周的Q返回的q䆾值可能与日期参数l出的年份不一_(d)(x)mysql> SELECT YEARWEEK('1987-01-01'); -> 198653
注意Q对于可选参?0 ?1Q周值的q回g同于WEEK()
函数所q回?0
)Q?WEEK()
Ҏ(gu)l定的年语境q回周倹{? -
HOUR(time)
- q回
time
的小时|范围?0
?23
Q?mysql> SELECT HOUR('10:05:03'); -> 10
-
MINUTE(time)
- q回
time
的分钟|范围?0
?59
Q?mysql> SELECT MINUTE('98-02-03 10:05:03'); -> 5
-
SECOND(time)
- q回
time
的秒|范围?0
?59
Q?mysql> SELECT SECOND('10:05:03'); -> 3
-
PERIOD_ADD(P,N)
- 增加
N
个月到时?P
(格式?YYMM
?YYYYMM
)中。以YYYYMM
格式q回倹{?注意Q期间参?P
不是 一个日期|(x)mysql> SELECT PERIOD_ADD(9801,2); -> 199803
-
PERIOD_DIFF(P1,P2)
- q回时期
P1
?P2
之间的月数?code>P1 ?P2
应该?YYMM
?YYYYMM
指定?注意Q时期参?P1
?P2
不是 日期|(x)mysql> SELECT PERIOD_DIFF(9802,199703); -> 11
-
DATE_ADD(date,INTERVAL expr type)
-
DATE_SUB(date,INTERVAL expr type)
-
ADDDATE(date,INTERVAL expr type)
-
SUBDATE(date,INTERVAL expr type)
- q些函数执行日期的算术运?code>ADDDATE() ?
SUBDATE()
分别?DATE_ADD()
?DATE_SUB()
的同义词??MySQL 3.23 中,如果表达式的双是一个日期值或一个日期时间型字段Q你可以使用+
?-
代替DATE_ADD()
?DATE_SUB()
(CZ如下)?参数date
是一?DATETIME
?DATE
|指定一个日期的开始?code>expr 是一个表辑ּQ指定从开始日期上增加q是减去间隔倹{?code>expr 是一个字W串Q它可以以一???/font> 领头表示一个负的间隔倹{?code>type 是一个关键词Q它标志着表达式以何格式被解释?下表昄type
?expr
参数是如何关联的Q?
?type
?/strong>expr
期望的格?/strong>SECOND
SECONDS
MINUTE
MINUTES
HOUR
HOURS
DAY
DAYS
MONTH
MONTHS
YEAR
YEARS
MINUTE_SECOND
"MINUTES:SECONDS"
HOUR_MINUTE
"HOURS:MINUTES"
DAY_HOUR
"DAYS HOURS"
YEAR_MONTH
"YEARS-MONTHS"
HOUR_SECOND
"HOURS:MINUTES:SECONDS"
DAY_MINUTE
"DAYS HOURS:MINUTES"
DAY_SECOND
"DAYS HOURS:MINUTES:SECONDS"
expr
的格式中QMySQL 允许M字符作ؓ(f)定界W。表中所昄的是的定界字W。如?date
参数是一?DATE
|q且计算的间隔仅仅有YEAR
?code>MONTH ?DAY
部分(没有旉部分)Q那么返回g是一?DATE
倹{否则返回值是一?DATETIME
|(x)mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; -> 1998-01-01 00:00:00 mysql> SELECT INTERVAL 1 DAY + "1997-12-31"; -> 1998-01-01 mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; -> 1997-12-31 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", -> INTERVAL 1 SECOND); -> 1998-01-01 00:00:00 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", -> INTERVAL 1 DAY); -> 1998-01-01 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", -> INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00 mysql> SELECT DATE_SUB("1998-01-01 00:00:00", -> INTERVAL "1 1:1:1" DAY_SECOND); -> 1997-12-30 22:58:59 mysql> SELECT DATE_ADD("1998-01-01 00:00:00", -> INTERVAL "-1 10" DAY_HOUR); -> 1997-12-30 14:00:00 mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); -> 1997-12-02
如果你指定了一个太短的间隔?没有包括type
关键词所期望的所有间隔部?QMySQL 假设你遗漏了间隔值的最左边部分。例如,如果指定一?type
?DAY_SECOND
Q那?expr
D期望包含天、小时、分钟和U部分。如果你?"1:10"
h定一个|MySQL 假设天和时部分被遗漏了Q指定的g表分钟和U。换句话_(d)"1:10" DAY_SECOND
被解释ؓ(f){h(hun)?"1:10" MINUTE_SECOND
。这cM?MySQL 解释TIME
gؓ(f)l过的时间而不是一天的时刻?注意Q如果依着包含一个时间部分的间隔增加或减一个日期|该日期值将被自动地转换C个日期时间|(x)mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY); -> 1999-01-02 mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR); -> 1999-01-01 01:00:00
如果你用了定不正的日期Q返回结果将?NULL
。如果你增加MONTH
?code>YEAR_MONTH ?YEAR
Qƈ且结果日期的天比新月份的最大天数还大,那么它将被调整到新月份的最大天敎ͼ(x)mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH); -> 1998-02-28
注意Q上面的例子中,单词INTERVAL
和关键词type
是不区分字母大小写的? -
EXTRACT(type FROM date)
-
EXTRACT()
函数使用?DATE_ADD()
?DATE_SUB()
一致的间隔cdQ但是它用于指定从日期中提取的部分,而不是进行日期算术运?mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102
-
TO_DAYS(date)
- l出一个日?
date
Q返回一个天??0 q开始的天数)Q?mysql> SELECT TO_DAYS(950501); -> 728779 mysql> SELECT TO_DAYS('1997-10-07'); -> 729669
TO_DAYS()
无意于用先于格里高里历?即现行的阛_)(1582)出现的|因ؓ(f)它不考虑当历法改变时所遗失的天数? -
FROM_DAYS(N)
- l出一个天?
N
Q返回一?DATE
|(x)mysql> SELECT FROM_DAYS(729669); -> '1997-10-07'
FROM_DAYS()
无意于用先于格里高里历?1582)出现的|因ؓ(f)它不考虑当历法改变时所遗失的天数? -
DATE_FORMAT(date,format)
- 依照
format
字符串格式化date
倹{下面的修饰W可被用?format
字符串中Q?
所有其它的字符不经q解释,直接复制到结果中Q?修饰W? 含义 %M
月的名字 ( January
..December
)%W
星期的名?( Sunday
..Saturday
)%D
有英文后~的某月的W几?( 0th
,1st
,2nd
,3rd
, etc.)%Y
q䆾Q数字的Q? ? %y
q䆾Q数字的Q? ? %X
周值的q䆾Q星期日是一个星期的W一天,数字的,4 位,?'%V' 一同? %x
周值的q䆾Q星期一是一个星期的W一天,数字的,4 位,?'%v' 一同? %a
~写的星期名 ( Sun
..Sat
)%d
月䆾中的天数Q数字的 ( 00
..31
)%e
月䆾中的天数Q数字的 ( 0
..31
)%m
月,数字?( 00
..12
)%c
月,数字?( 0
..12
)%b
~写的月份名 ( Jan
..Dec
)%j
一q中的天?( 001
..366
)%H
时 ( 00
..23
)%k
时 ( 0
..23
)%h
时 ( 01
..12
)%I
时 ( 01
..12
)%l
时 ( 1
..12
)%i
分钟Q数字的 ( 00
..59
)%r
旉Q?2 时 ( hh:mm:ss [AP]M
)%T
旉Q?4 时 ( hh:mm:ss
)%S
U?( 00
..59
)%s
U?( 00
..59
)%p
AM
?PM
%w
一周中的天?( 0
=Sunday..6
=Saturday)%U
星期 ( 00
..53
)Q星期日是一个星期的W一?%u
星期 ( 00
..53
)Q星期一是一个星期的W一?%V
星期 ( 01
..53
)Q星期日是一个星期的W一天。与 '%X' 一起?%v
星期 ( 01
..53
)Q星期一是一个星期的W一天。与 '%x' 一起?%%
一个字???/font> mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -> 'Saturday October 1997' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -> '4th 97 Sat 04 10 Oct 277' mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V'); -> '1998 52'
?MySQL 3.23 中,在格式修饰符前需要字W?`%'。在更早?MySQL 版本中,`%' 是可选的?月䆾与天修饰W的范围从零开始的原因是,?MySQL 3.23 中,它允许存储不完善的日期?例如'2004-00-00'
)? -
TIME_FORMAT(time,format)
- 它的使用Ҏ(gu)与上面的
DATE_FORMAT()
函数怼Q但?format
字符串只包含处理时、分和秒的那些格式修饰符。用其它的修饰W会(x)产生一?NULL
值或0
? -
CURDATE()
-
CURRENT_DATE
- ?
'YYYY-MM-DD'
?YYYYMMDD
格式q回当前的日期|q回的格式取决于该函数是用于字符串还是数字语境中Q?mysql> SELECT CURDATE(); -> '1997-12-15' mysql> SELECT CURDATE() + 0; -> 19971215
-
CURTIME()
-
CURRENT_TIME
- ?
'HH:MM:SS'
?HHMMSS
格式q回当前的时间|q回的格式取决于该函数是用于字符串还是数字语境中Q?mysql> SELECT CURTIME(); -> '23:50:26' mysql> SELECT CURTIME() + 0; -> 235026
-
NOW()
-
SYSDATE()
-
CURRENT_TIMESTAMP
- ?
'YYYY-MM-DD HH:MM:SS'
?YYYYMMDDHHMMSS
格式q回当前的日期时间|q回的格式取决于该函数是用于字符串还是数字语境中Q?mysql> SELECT NOW(); -> '1997-12-15 23:50:26' mysql> SELECT NOW() + 0; -> 19971215235026
注意Q函?NOW()
在每个查询中只计一ơ,也就是在查询开始执行时。这是_(d)如果在一个单独的查询中多ơ引用了NOW()
Q它只会(x)l出值都是一个相同的旉? -
UNIX_TIMESTAMP()
-
UNIX_TIMESTAMP(date)
- 如果调用时没有参敎ͼ以无W号的整数Ş式返回一?Unix 旉??
'1970-01-01 00:00:00'
GMT 开始的U数)。如果以一个参?date
调用UNIX_TIMESTAMP()
Q它?yu)返回该参数g'1970-01-01 00:00:00'
GMT 开始经q的U数倹{?code>date 可以是一?DATE
字符Ԍ一?DATETIME
字符Ԍ一?TIMESTAMP
Q或者以一?YYMMDD
?YYYYMMDD
昄的本地时_(d)(x)mysql> SELECT UNIX_TIMESTAMP(); -> 882226357 mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580
?UNIX_TIMESTAMP
被用于一?TIMESTAMP
列时Q函数直接返回一个内部的旉戛_|而不q行一个隐含地 “string-to-unix-timestamp?转换。如果你传递一个超围的日期参数l?UNIX_TIMESTAMP()
Q它?yu)返?0Q但是请注意QMySQL 对其仅仅q行基本的检?q范?1970-2037Q月?01-12Q日?01-31)?如果你希望减?UNIX_TIMESTAMP()
列,你应该需要将l果强制转换Z有符h数。查看章?6.3.5 Cast 函数? -
FROM_UNIXTIME(unix_timestamp [,format])
- ?
'YYYY-MM-DD HH:MM:SS'
?YYYYMMDDHHMMSS
格式q回一?unix_timestamp
参数|q回值的形式取决于该函数使用于字W串q是数字语境?如果format
l出Q返回gformat
字符串被格式?code>format 可以包含?DATE_FORMAT()
函数同样的修饰符?mysql> SELECT FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> SELECT FROM_UNIXTIME(875996580) + 0; -> 19971004222300 mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x'); -> '1997 23rd December 03:43:30 1997'
-
SEC_TO_TIME(seconds)
- ?
'HH:MM:SS'
?HHMMSS
格式q回参数seconds
被{换到时分U后的|q回值的形式取决于该函数使用于字W串q是数字语境Q?mysql> SELECT SEC_TO_TIME(2378); -> '00:39:38' mysql> SELECT SEC_TO_TIME(2378) + 0; -> 3938
-
TIME_TO_SEC(time)
- 参?
time
转换为秒数后q回Q?mysql> SELECT TIME_TO_SEC('22:23:00'); -> 80580 mysql> SELECT TIME_TO_SEC('00:39:38'); -> 2378