2008年5月20日星期二

MySQL日期函数全攻略

对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型。

这里是一个使用日期函数的例子。下面的查询选择了所有记录,其date_col的值是在最后30天以内:

mysql> SELECT something FROM table PHPChina 开源社区门户 Q;P q A7c7S \ ~

WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;

DAYOFWEEK(date) PHPChina 开源社区门户 { R h m"a-b6n

返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。这些索引值对应于ODBC标准。

3e Y3r Y h0mysql> select DAYOFWEEK('1998-02-03');

D P p0W l T:v N { U v0-> 3

WEEKDAY(date) PHPChina 开源社区门户 p(J6w D l6} ^&p#r D

返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。

~1b g&h+q U e7O P,m s G- 0mysql> select WEEKDAY('1997-10-04 22:23:00');

0D [ [,v*~6{ E D A0-> 5 PHPChina 开源社区门户0^(e J'T4W3]

mysql> select WEEKDAY('1997-11-05'); PHPChina 开源社区门户 A o8N ` Y1@ j5V.g

-> 2

DAYOFMONTH(date) PHPChina 开源社区门户.[ S s u A*])T g4t

返回date的月份中日期,在1到31范围内。

\ P T:K8j!b,` I0mysql> select DAYOFMONTH('1998-02-03'); PHPChina 开源社区门户!O1x o o R'T {

-> 3

DAYOFYEAR(date) PHPChina 开源社区门户 ` u:_ }6{ o o

返回date在一年中的日数, 在1到366范围内。

m ~* R L$B Z2O0mysql> select DAYOFYEAR('1998-02-03');

d ]0f D$r m s G0-> 34

MONTH(date) PHPChina 开源社区门户3^(z \5u p D u P1v

返回date的月份,范围1到12。

(r9{$` r A F z;e0mysql> select MONTH('1998-02-03'); PHPChina 开源社区门户 X O8c z"@/~ E u

-> 2

DAYNAME(date)

x6v!V X%w6s [ q @ H0返回date的星期名字。 PHPChina 开源社区门户0[4}#_ C G B8w

mysql> select DAYNAME("1998-02-05"); PHPChina 开源社区门户 h J)D W*] l f

-> 'Thursday'

MONTHNAME(date)

8Q y I k1m t q!y \0返回date的月份名字。 PHPChina 开源社区门户,]y#l C l0d$h ^

mysql> select MONTHNAME("1998-02-05");

^:L:W J \0-> 'February'

QUARTER(date) PHPChina 开源社区门户 `&Z.n7r9E

返回date一年中的季度,范围1到4。 PHPChina 开源社区门户 _ [ B @:v _

mysql> select QUARTER('98-04-01');

%p ] J [ a/o a0R*^!t'C0-> 2

WEEK(date)

_4x P M"m [ i0 

_9c h*W o b ~+Q0WEEK(date,first) PHPChina 开源社区门户 T R 4G n A$~

对于星期天是一周的第一天的地方,有一个单个参数,返回date的周数,范围在0到52。2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是0,星期从星期天开始,如果第二个参数是1,从星期一开始。 PHPChina 开源社区门户 N7`;F"s4R4`9H x

mysql> select WEEK('1998-02-20');

k8[ x+-d X T q0-> 7 PHPChina 开源社区门户 v:@ D }%] i j @

mysql> select WEEK('1998-02-20',0);

v ]$c8a6S+]0-> 7 PHPChina 开源社区门户 m ] l:z _ i

mysql> select WEEK('1998-02-20',1);

v b S+Q1W&H)j+t0-> 8

YEAR(date) PHPChina 开源社区门户'[1a8_ eE r \

返回date的年份,范围在1000到9999。

"o F,m `/C u b `!0mysql> select YEAR('98-02-03');

t O$R { f ^ T c7J0-> 1998

HOUR(time) PHPChina 开源社区门户 p,K$S+t Z z'f \ S;p

返回time的小时,范围是0到23。 PHPChina 开源社区门户 p+V Q" c'P

mysql> select HOUR('10:05:03'); PHPChina 开源社区门户3z)q w K k;C B

-> 10

MINUTE(time)

#G ~ { F n0
返回time的分钟,范围是0到59。 PHPChina 开源社区门户4}3u)`&x k b/b d!n

mysql> select MINUTE('98-02-03 10:05:03');

p L }'S+F%^ z0-> 5

SECOND(time) PHPChina 开源社区门户 } [1w'{ ] R$_ b

回来time的秒数,范围是0到59。 PHPChina 开源社区门户'O Y.#v$c

mysql> select SECOND('10:05:03'); PHPChina 开源社区门户 H"f G"n0m

-> 3

PERIOD_ADD(P,N)

.m.p r i ^1Z(D P.q k F P0增加N个月到阶段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意阶段参数P不是日期值。 PHPChina 开源社区门户$m6{ f7G1q M j

mysql> select PERIOD_ADD(9801,2);

1I+o m)i z S v0-> 199803

PERIOD_DIFF(P1,P2) PHPChina 开源社区门户9m7a*N E R "J f J5 Q

返回在时期P1和P2之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数P1和P2不是日期值。 PHPChina 开源社区门户 u F#Y3m/r R*K5~

mysql> select PERIOD_DIFF(9802,199703);

y$y B E B4A:p L _7Q0-> 11

DATE_ADD(date,INTERVAL expr type) PHPChina 开源社区门户 J#v,k ` R 5G K

 

4M J(Z \6W/p(M a O0DATE_SUB(date,INTERVAL expr type)

)n-[!A/x E$g8~0 

%J1G9W!` D M/Y4}5\ S0ADDDATE(date,INTERVAL expr type)

L } _9L o4H0  PHPChina 开源社区门户+} .L _6F);c J

SUBDATE(date,INTERVAL expr type) PHPChina 开源社区门户 R R-Q ^ Q w

这些功能执行日期运算。对于MySQL 3.22,他们是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同义词。PHPChina 开源社区门户 l F-m L T

在MySQL 3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(见例子)date是一个指定开始日期的PHPChina 开源社区门户 e J F7X B w. 4Q

DATETIME或DATE值,expr是指定加到开始日期或从开始日期减去的间隔值一个表达式,expr是一个字符串;它可以以

y x6s Y8d#]-@,q A0一个“-”开始表示负间隔。type是一个关键词,指明表达式应该如何被解释。EXTRACT(type FROM date)函数从日期PHPChina 开源社区门户 k:a _ c L0l P

中返回“type”间隔。下表显示了type和expr参数怎样被关联: type值含义 期望的expr格式 PHPChina 开源社区门户 k(\ z F {

SECOND 秒 SECONDS PHPChina 开源社区门户 C m g"i6U n3["u `

MINUTE 分钟 MINUTES

D o* w(Z5r'R0HOUR 时间 HOURS PHPChina 开源社区门户 p p(W N

DAY 天 DAYS PHPChina 开源社区门户 Q%H }5e O

MONTH 月 MONTHS PHPChina 开源社区门户 g [ c t A/n

YEAR 年 YEARS PHPChina 开源社区门户 a O.Q/H _*S0v9S*z

MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS"

b {(c-g 0A$ 5p0HOUR_MINUTE 小时和分钟 "HOURS:MINUTES"

.Q B i0X2y0DAY_HOUR 天和小时 "DAYS HOURS"

%@ A9d)x _'G c t6` G0YEAR_MONTH 年和月 "YEARS-MONTHS"

N/N a {-S d0HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS"

c:Y9T 4N M0DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES" PHPChina 开源社区门户 G [ h F e$f

DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS"

MySQL在expr格式中允许任何标点分隔符。表示显示的是建议的分隔符。如果date参数是一个DATE值并且你的计算仅仅包含YEAR、MONTH和DAY部分(即,没有时间部分),结果是一个DATE值。否则结果是一个DATETIME值。

mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; PHPChina 开源社区门户5\4l J d ` x h

-> 1998-01-01 00:00:00 PHPChina 开源社区门户6j#v ~:j }~

mysql> SELECT INTERVAL 1 DAY + "1997-12-31"; PHPChina 开源社区门户2J j {3v L

-> 1998-01-01

Q4[3D6i Q e k6x.t0mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; PHPChina 开源社区门户 5Q q dL V F

-> 1997-12-31 23:59:59

6e!i q a I"a s 0mysql> SELECT DATE_ADD("1997-12-31 23:59:59", PHPChina 开源社区门户 d&l b/W i

INTERVAL 1 SECOND);

3s Q [ E-L*O j T.l0-> 1998-01-01 00:00:00

tB E G I N j5x0mysql> SELECT DATE_ADD("1997-12-31 23:59:59", PHPChina 开源社区门户G b4\7} u

INTERVAL 1 DAY); PHPChina 开源社区门户#g;l&F e h9P

-> 1998-01-01 23:59:59

$T R X,o5E&S z c ] V0mysql> SELECT DATE_ADD("1997-12-31 23:59:59", PHPChina 开源社区门户 _ @ { h Q B'Q%\ V(}8T

INTERVAL "1:1" MINUTE_SECOND); PHPChina 开源社区门户;\9H3F+g y Y q7L N

-> 1998-01-01 00:01:00 PHPChina 开源社区门户"Q L M)D0X ` l

mysql> SELECT DATE_SUB("1998-01-01 00:00:00",

9t;~.w h&} H Z0INTERVAL "1 1:1:1" DAY_SECOND);

'a'z2N J J l u+V w i0-> 1997-12-30 22:58:59

5B2V I o r 0mysql> SELECT DATE_ADD("1998-01-01 00:00:00", PHPChina 开源社区门户*^:y j8_1e"L(W H.[

INTERVAL "-1 10" DAY_HOUR);

R:U"g \ i6a z H3S0-> 1997-12-30 14:00:00 PHPChina 开源社区门户5z9z#r+h C m

mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);

p,f9^A J N C%W P R0-> 1997-12-02 PHPChina 开源社区门户 r w @/x B D/b c

mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");

U H d v9}'T r j0-> 1999

} Z5k \ m ]0mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); PHPChina 开源社区门户 f m D q H ` ~0G L

-> 199907 PHPChina 开源社区门户"L Y m"B y-t n h

mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");

\'d2} x K$T0-> 20102

如果你指定太短的间隔值(不包括type关键词期望的间隔部分),MySQL假设你省掉了间隔值的最左面部分。例如,如果你指定一个type是DAY_SECOND,值expr被希望有天、小时、分钟和秒部分。如果你象"1:10"这样指定值,MySQL假设日子和小时部分是丢失的并且值代表分钟和秒。换句话说,"1:10" DAY_SECOND以它等价于"1:10" MINUTE_SECOND的方式解释,这对那MySQL解释TIME值表示经过的时间而非作为一天的时间的方式有二义性。如果你使用确实不正确的日期,结果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。

mysql> select DATE_ADD('1998-01-30', Interval 1 month); PHPChina 开源社区门户 a ^ F4Q r U&b S

-> 1998-02-28

注意,从前面的例子中词INTERVAL和type关键词不是区分大小写的。 PHPChina 开源社区门户 E2P F y q z



[ x6X)[ A6@ [4J o0TO_DAYS(date) PHPChina 开源社区门户 T8b i$^ z/e e-w n

给出一个日期date,返回一个天数(从0年的天数)。

M B w S \*E)A5Z c0mysql> select TO_DAYS(950501); PHPChina 开源社区门户 {8] ~5K Y(.B(E

-> 728779 PHPChina 开源社区门户 x([ } o f { w ^

mysql> select TO_DAYS('1997-10-07');

,S b s7K \9g:N0-> 729669

TO_DAYS()PHPChina 开源社区门户7 u d'I9t y x

不打算用于使用格列高里历(1582)出现前的值。

FROM_DAYS(N)

B%s C w z7\ Z0
给出一个天数N,返回一个DATE值。

n b0R+J y0mysql> select FROM_DAYS(729669);

Q8z u F+g J B %A0-> '1997-10-07'

DATE_FORMAT(date,format) PHPChina 开源社区门户+D ` y q w&n

根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December) PHPChina 开源社区门户 \ H'g"v&i

%W 星期名字(Sunday……Saturday)

.U*H:K e%p ~ \0a:w _#V0%D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。)

:N2g v j ~ p l,c0%Y 年, 数字, 4 位

p)] c;p p A v-@0%y 年, 数字, 2 位

] y s Y \5v {0%a 缩写的星期名字(Sun……Sat) PHPChina 开源社区门户#v J&r l z A)D u6K

%d 月份中的天数, 数字(00……31) PHPChina 开源社区门户&n J ](d7d- ,[ q0W

%e 月份中的天数, 数字(0……31) PHPChina 开源社区门户$F0P q1{.Y W

%m 月, 数字(01……12)

:g z#_ H5[ n I0%c 月, 数字(1……12)

} k-D%e'u E y m G q+h0%b 缩写的月份名字(Jan……Dec) PHPChina 开源社区门户*B0w @ e W8`

%j 一年中的天数(001……366) PHPChina 开源社区门户!c y$v0[$` v

%H 小时(00……23) PHPChina 开源社区门户 a&^,W k P$K I(y6~

%k 小时(0……23)

.[;r n1v1@9W0%h 小时(01……12)

} a!s7G#R o _0S n9H0I C0%I 小时(01……12)

5LT e0_!@ M S v K*t0%l 小时(1……12) PHPChina 开源社区门户"t5X w R$\ i ^ E'v

%i 分钟, 数字(00……59) PHPChina 开源社区门户 W& a P S4r h

%r 时间,12 小时(hh:mm:ss [AP]M)

_ ] } k*J z } ^"M0%T 时间,24 小时(hh:mm:ss)

S'U(z c p0%S 秒(00……59)

f9x;o \ G0%s 秒(00……59)

4t(n0Y%F/Q j U {0%p AM或PM PHPChina 开源社区门户!r#\ } r j R.O;p

%w 一个星期中的天数(0=Sunday ……6=Saturday )

F V3K"@ M q y/X0%U 星期(0……52), 这里星期天是星期的第一天 PHPChina 开源社区门户 F$O7` e q"l

%u 星期(0……52), 这里星期一是星期的第一天

+H \5G%k.T } g4X$ 2u#]0%% 一个文字“%”。

所有的其他字符不做解释被复制到结果中。

mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');

n `1y } r#U n&~9N0-> 'Saturday October 1997'

g `1CU':b0mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');

Q G7z,V#V ~/R'N0-> '22:23:00'

1Z a*^ z8X A)R"P0mysql> select DATE_FORMAT('1997-10-04 22:23:00',

)o%X J&P3-S( @.P Y b0'%D %y %a %d %m %b %j');

p'g l"{ i0-> '4th 97 Sat 04 10 Oct 277'

3A n ` z* { Q X0mysql> select DATE_FORMAT('1997-10-04 22:23:00', PHPChina 开源社区门户 ^ w L z%p f S

'%H %k %I %r %T %S %w');

$L [4a8X L i z X k0-> '22 22 10 10:23:00 PM 22:23:00 00 6'

'V:N a H S)I0MySQL3.23中,在格式修饰符字符前需要%。在MySQL更早的版本中,%是可选的。

TIME_FORMAT(time,format)

Q `!Z B B P5t I:t0这象上面的DATE_FORMAT()函数一样使用,但是format字符串只能包含处理小时、分钟和秒的那些格式修饰符。其他修饰符产生一个NULL值或0。 PHPChina 开源社区门户 k W D:E9R S p G*J u



(@ `(n v k8wJ'N k f y0CURDATE() PHPChina 开源社区门户%i7^ W"g `;F a8X z L ] g

  PHPChina 开源社区门户)W3i c j*e

CURRENT_DATE

4k s,d,h U C7c a0以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取决于函数是在一个字符串还是数字上下文被使用。 PHPChina 开源社区门户 P' l9^ s c%a lg T

mysql> select CURDATE();

+r q w w3x0-> '1997-12-15'

~4i3o2W/V0mysql> select CURDATE() + 0;

*8` O y,U6O)Q f0-> 19971215

CURTIME() PHPChina 开源社区门户 r"k9v \0}%o1x {

 

2o O B 1U Z ot0CURRENT_TIME PHPChina 开源社区门户1y I1_$k x

以'HH:MM:SS'或HHMMSS格式返回当前时间值,取决于函数是在一个字符串还是在数字的上下文被使用。

8k3 R i p-m7e'X r0mysql> select CURTIME();

\:D;A D ~$j k,s#y,I&o0-> '23:50:26'

2k( R4a:P J0mysql> select CURTIME() + 0; PHPChina 开源社区门户 E U V ~ i.e5Z c m h

-> 235026

NOW() PHPChina 开源社区门户 y X2\ dc B

 

#Z k4n3J p9t { k Q;B4g0SYSDATE()

l f }0A ad'@0  PHPChina 开源社区门户0_9B \ D.y#D0Y

CURRENT_TIMESTAMP PHPChina 开源社区门户(E r D S2};a E,U J

以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。 PHPChina 开源社区门户 w C$d x! g$~"q

mysql> select NOW();

B/Q v Z"R f W \ 0-> '1997-12-15 23:50:26' PHPChina 开源社区门户.R G r*Y _ [ !@ l ~

mysql> select NOW() + 0; PHPChina 开源社区门户 v h Q$r z!}1} n

-> 19971215235026

UNIX_TIMESTAMP() PHPChina 开源社区门户 W9m7F q _$e W h

 

j G+W1{ z F0UNIX_TIMESTAMP(date)

.Y6]/F c p#K7a0
如果没有参数调用,返回一个Unix时间戳记(从'1970-01-01 00:00:00'GMT开始的秒数)。如果UNIX_TIMESTAMP()用一个date参数被调用,它返回从'1970-01-01 00:00:00' GMT开始的秒数值。date可以是一个DATE字符串、一个DATETIME字符串、一个TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地时间的一个数字。 PHPChina 开源社区门户8]&2N ` ,J$S

mysql> select UNIX_TIMESTAMP();

o B"P.~7E3y G0-> 882226357 PHPChina 开源社区门户 V Z;O&c a'a \ ~ V0J y

mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); PHPChina 开源社区门户 p j2[ Q2] X

-> 875996580 PHPChina 开源社区门户4M G n f0} D c:{4S

当UNIX_TIMESTAMP被用于一个TIMESTAMP列,函数将直接接受值,没有隐含的“string-to-unix-timestamp”变换。

FROM_UNIXTIME(unix_timestamp)

b W4W [ P Q)F B g0以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp参数所表示的值,取决于函数是在一个字符串还是或数字上下文中被使用。 PHPChina 开源社区门户,p9@,Q h4n !R P

mysql> select FROM_UNIXTIME(875996580);

@ l E L I d0-> '1997-10-04 22:23:00'

:c-v Y M(V h @ R y 0mysql> select FROM_UNIXTIME(875996580) + 0;

J [9` u7c D0e0-> 19971004222300

FROM_UNIXTIME(unix_timestamp,format)

Z W I9P g P j J.X [0返回表示 Unix 时间标记的一个字符串,根据format字符串格式化。format可以包含与DATE_FORMAT()函数列出的条目同样的修饰符。 PHPChina 开源社区门户)y k S8i v p

mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),

:d"k } L x u X0'%Y %D %M %h:%i:%s %x');

)\7f D ` G'S)I0-> '1997 23rd December 03:43:30 x'

SEC_TO_TIME(seconds)

6K E ] T X z f j O'i0返回seconds参数,变换成小时、分钟和秒,值以'HH:MM:SS'或HHMMSS格式化,取决于函数是在一个字符串还是在数字上下文中被使用。 PHPChina 开源社区门户 Y o z n'n.o

mysql> select SEC_TO_TIME(2378); PHPChina 开源社区门户7e)O C r Q W+l `"y3I e+x

-> '00:39:38'

v1}&r;u$x G!g u E0mysql> select SEC_TO_TIME(2378) + 0; PHPChina 开源社区门户 ~%U2H r s Y

-> 3938

TIME_TO_SEC(time)

L ]"t,@ u d*I#\0返回time参数,转换成秒。

7g `%O%w n*~*D#m0mysql> select TIME_TO_SEC('22:23:00'); PHPChina 开源社区门户 T9j4 A%R

-> 80580 PHPChina 开源社区门户5Y:O F v B u

mysql> select TIME_TO_SEC('00:39:38');

L8.I$h O0-> 2378

没有评论: