提取日期的特定部分是非常必要的,比如检索本年度每个月16日的销售量、检索访问客户集中的时间段,这些需要对日期的特定部分进行提取。主流数据库对这个功能都提供了很好的支持,下面分别进行介绍。
1. MySQL
MySQL中提供了一个DATE_FORMAT()函数,用来将日期按照特定格式进行格式化,这个函数的参数格式如下:
DATE_FORMAT(date, format)
其中参数date为待计算的日期值,而参数format为格式化字符串,格式化字符串中可以采用如下的占位符:
占位符 |
说明 |
%a |
缩写的星期几 (Sun…Sat) |
%b |
缩写的月份名( Jan …… Dec ) |
%c |
数字形式的月份( 0 …… 12 ) |
%D |
当月的第几天带英文后缀( 0th ,1st ,2nd ,3rd ,… ) |
%d |
当前的第几天,两位数字形式,不足梁文则补零( 00 …… 31 ) |
%e |
当月的第几天,数字形式( 0 …… 31 ) |
%f |
毫秒 |
%H |
24 小时制的小时( 00 …… 23 ) |
%h |
12 小时制的小时( 00 …… 12 ) |
%I |
12 小时制的小时( 01 …… 12 ) |
%i |
数字形式的分钟( 00 …… 59 ) |
%j |
日期在当年中的天数 |
%k |
24 进制的小时( 0 …… 23 ) |
%l |
12 进制的小时( 1 …… 12 ) |
%M |
月份名( January …… December ) |
%m |
两位数字表示的月份( 00 …… 12 ) |
%p |
上午还是下午( AM…PM ) |
%r |
12 小时制时间,比如 08:09:29 |
%S |
秒数( 00…59 ) |
%s |
秒数( 00 …… 59 ) |
%T |
时间, 24 小时制,格式为 hh:mm:ss |
%U |
所属周是当年的第几周,周日当作第一天( 00 …… 53 ) |
%u |
所属周是当年的第几周,周一当作第一天 ( 00 …… 53 ) |
%V |
所属周是当年的第几周,周日当作第一天 ( 01 …… 53 ) |
%v |
所属周是当年的第几周,周日当作第一天 ( 01 …… 53 ) |
%W |
星期几 (Sunday …… Saturday) |
%w |
星期几( 0=Sunday …… 6=Sunday ) |
%X |
本周所属年,周日当作第一天 |
%x |
本周所属年,周一当作第一天 |
%Y |
年份数, 4 位数字 |
%y |
年分数, 2 位数字 |
组合使用这些占位符就可以实现非常复杂的字符串格式化逻辑,比如下面的SQL语句将出生日期FBirthday和注册日期FRegday分别按照两种格式进行格式化:
SELECT
FBirthday,
DATE_FORMAT(FBirthday, '%y-%M %D %W') AS BD,
FRegday,
DATE_FORMAT(FRegday, '%Y年%m月%e日') AS RD
FROM T_Person
很明显,如果只适用单独的占位符就可以实现提取日期特定部分的功能了,比如DATE_FORMAT(date, %Y)可以用来提取日期的年份的部分,DATE_FORMAT(date, '%H')可以用来提取日期的小时部分,DATE_FORMAT(date,'%M')可以用来提取日期的月份名成。下面的SQL用于提取每个人的出生年份,出生时是当年的第几天和出生时是当年的第几周:
SELECT
FBirthday,
DATE_FORMAT(FBirthday,'%Y') as y,
DATE_FORMAT(FBirthday, '%j') as d,
DATE_FORMAT(FBirthday, '%U') as u
FROM T_Person
2. Oracle
在5.3.5的标题3中我们介绍了在Oracle中使用TO_CHAR()函数格式化日期的方法,使用它就可以提取日期的任意部分,比如下面的SQL用于提取每个人的出生年份,出生时尚当年的第几天和出生是谁当年的第几周:
SELECT
FBirthday,
TO_CHAR(FBirthday, 'YYYY') AS Y,
TO_CHAR(FBirthday, 'DDD') AS D,
TO_CHAR(FBirthday, 'WW') AS u,
FROM T_Person