
如果查询结果返回的是一个时间戳或者是一个字符串型的日期时间值,那么从客户端或者程序端直接显示出来的结果不是那么的直观,尤其是出现时间戳,用户是无法知道该值代表的具体含义。一般的关系型数据库都提供了内置函数对时间戳或者字符串型的日期时间值进行格式化,经过格式化后的查询结果可以更直观的展示给用户。
StoneDB 和 MySQL 都提供了如下四个内置函数对日期时间进行格式化。
1)date_format(date, format):对日期进行格式化
2)time_format(time, format):对时间进行格式化
3)from_unixtime(unix_timestamp,format):将时间戳根据指定的格式格式化为对应的日期时间
4)str_to_date(str, format):将字符串根据指定的格式格式化为对应的日期时间
虽然这四个内置函数在两种数据库上实现的功能是相同的,但时间格式符号并非是通用的。同一个符号在两种数据库上代表的含义可能是不同的,例如:%M 在 StoneDB 上表示的是分钟,而在 MySQL 上表示的是月份的英文全写。不同的符号可能表达的是同一个含义,例如:%M 在 StoneDB 上表示的是分钟,而在 MySQL 上分钟用 %i 来表示。
StoneDB
StoneDB 的格式符号 format 有如下取值,以及各个格式符号表达的含义。
格式符号 | 描述 |
%a | 星期的英文缩写(Sun~Sat) |
%A | 星期的英文全写(Sunday~Saturday) |
%b | 月份的英文缩写(Jan~Dec) |
%B | 月份的英文全写(January~December) |
%c | 星期、月份、日、时间、年组合表达式,如:Fri Nov 29 21:33:09 1973 |
%C | 世纪数字(年/100),是一个2位数的整数 |
%d | 日(01~31) |
%D | 月、日、年组合表达式,如:04/13/22 |
%e | 日(1~31) |
%F | 年、月、日组合表达式,如:2024-01-31 |
%g | 年份的后两位数,如:24 |
%G | 年份,如:2024 |
%h | 月份的英文缩写(Jan~Dec) |
%H | 24小时制(0~23) |
%I | 12小时制(0~12) |
%j | 一年中的第几天(001~366) |
%k | 24小时制(0~23) |
%l | 12小时制(0~12) |
%m | 月份(01~12) |
%M | 分钟(0~59) |
%n | 换行符 |
%p | AM 或者 PM |
%P | am 或者 pm |
%r | 12小时格式(hh:mm:ss AM/PM),如:09:33:09 PM |
%R | 24小时格式(hh:mm),如:21:33 |
%s | 时间戳 |
%S | 秒(0~59) |
%T | 24小时格式(hh:mm:ss),如:21:33:09 |
%u | 以十进制表示的星期几,范围为1到7,星期一为1 |
%U | 一年中的第几周(00..53),其中周日是一周中的第一天 |
%V | 一年中的第几周(01..53),其中第1周是新一年中至少有4天的第一周 |
%w | 以十进制表示的星期几,范围为0到6,星期日为0 |
%W | 一年中的星期(00~53),每周的开始是星期天 一年中的第几周(00..53),从第一个星期一开始作为第01周的第一天 |
%x | 月、日、年组合表达式,如:11/29/73 |
%X | 24小时格式(hh:mm:ss),如:21:33:09 |
%y | 年份的后两位数字 |
%Y | 年份 |
%z | +hhmm或-hhmm数字时区(即UTC的小时和分钟偏移量) |
%Z | 时区名称或缩写 |
MySQL
MySQL 的格式符号 format 有如下取值,以及各个格式符号表达的含义。
格式符号 | 描述 |
%a | 星期的英文缩写(Sun~Sat) |
%b | 月份的英文缩写(Jan~Dec) |
%c | 月份(0~12) |
%d | 日(00~31) |
%D | 带有英文后缀的一个月的哪一天(0th, 1st, 2nd, 3rd, …) |
%e | 日(0~31) |
%f | 微秒(000000~999999) |
%h | 12小时制(0~12) |
%H | 24小时制(0~23) |
%i | 分钟(0~59) |
%I | 12小时制(0~12) |
%j | 一年中的第几天(001~366) |
%k | 24小时制(0~23) |
%l | 12小时制(0~12) |
%m | 月份(00~12) |
%M | 月份的英文全写(January~December) |
%p | AM 或者 PM |
%r | 12小时格式(hh:mm:ss AM/PM) |
%s | 秒(0~59) |
%S | 秒(0~59) |
%T | 24小时格式(hh:mm:ss) |
%U | 一年中的第几周(00..53),其中周日是一周中的第一天 |
%u | 一年中的第几周(00..53),其中周一是一周中的第一天 |
%V | 一年中的第几周(01..53),其中周日是一周中的第一天 |
%v | 一年中的第几周(01..53),其中周一是一周中的第一天 |
%W | 星期的英文全写(Sunday~Saturday) |
%w | 以十进制表示的星期几,范围为0到6,星期日为0 |
%X | 年份 |
%x | 年份 |
%Y | 年份 |
%y | 年份的后两位数字 |
兼容格式符号
从以上 StoneDB 格式符号列表和 MySQL 格式符号列表可以看出,两种数据库有相同的格式符号,并且它们的表达含义也是相同的,我们可以称这些格式符号是两种数据库的兼容格式符号。若是从 MySQL 迁移到 StoneDB,在对时间进行格式化时,需要使用这些兼容格式符号对SQL进行改造,否则会返回不一样的结果集。如下列表是两种数据库的兼容格式符号和表达的含义。
格式符号 | 描述 |
%a | 星期的英文缩写(Sun~Sat) |
%b | 月份的英文缩写(Jan~Dec) |
%d | 日(00~31) |
%e | 日(1~31) |
%H | 24小时制(0~23) |
%I | 12小时制(0~12) |
%j | 一年中的第几天(001~366) |
%k | 24小时制(0~23) |
%l | 12小时制(0~12) |
%m | 月份(00~12) |
%p | AM 或者 PM |
%r | 12小时格式(hh:mm:ss AM/PM),如:09:33:09 PM |
%S | 秒(0~59) |
%T | 24小时格式(hh:mm:ss),如:21:33:09 |
%U | 一年中的第几周(00..53),其中周日是一周中的第一天 |
%w | 以十进制表示的星期几,范围为0到6,星期日为0 |
%y | 年份的后两位数字 |
%Y | 年份 |
两种数据库的格式符号使用方法都比较灵活,但我们只需要取其中最适用的。例如:StoneDB 表达年份的格式符号有 %Y、%G,而 MySQL 表达年份的格式符号有 %Y、%X、%x,如果想达到通用的目的,则可以取两者的交集,即用 %Y 格式符号来表达年份。这里出现了一个比较特殊的情况,即 StoneDB 表达分钟时,使用的格式符号是 %M,而 MySQL 使用的格式符号是 %i,也就是说两者没有共同的格式符号,这种情况就选择 %T,因为都能表达"时:分:秒"这个组合。在两种数据库间想达到通用的目的,在使用格式符号时,有如下建议。
StoneDB | MySQL | 建议项 | |
年份 | %Y、%G | %Y、%X、%x | %Y |
月份 | %B、%b、%h、%m | %b、%c、%M、%m | %m |
日 | %d、%e | %D、%d、%e | %d 或者 %e |
时 | %H、%I、%k、%l | %H、%h、%I、%k、%l | %H(24小时制) %I(12小时制) |
分 | %M | %i | %T |
秒 | %S | %S、%s | %S |
星期 | %A、%a、%u | %a、%W | %a |
年月日 | %Y-%m-%d、%D、%F、%x | %Y-%m-%d | %Y-%m-%d |
时分秒 | %r、%T、%X | %r、%T | %T %r(AM/PM制) |
示例
对时间戳格式化
如下示例是将一个 UNIX 时间戳进行格式化,将 UNIX 时间戳格式化为可读的 "yyyy-mm-dd 24hh:mm:ss week" 的组合结果返回给用户。通过兼容格式符号列表可知,可选择如下格式符号。
create table t_from_unixtime(id int);
insert into t_from_unixtime values(123456789),(987654321);
--StoneDB
> select id,from_unixtime(id,'%Y-%m-%d %T %a') from t_from_unixtime;
+-----------+------------------------------------+
| id | from_unixtime(id,'%Y-%m-%d %T %a') |
+-----------+------------------------------------+
| 123456789 | 1973-11-29 21:33:09 Thu |
| 987654321 | 2001-04-19 04:25:21 Thu |
+-----------+------------------------------------+
2 rows in set (0.00 sec)
--MySQL
> select id,from_unixtime(id,'%Y-%m-%d %T %a') from t_from_unixtime;
+-----------+------------------------------------+
| id | from_unixtime(id,'%Y-%m-%d %T %a') |
+-----------+------------------------------------+
| 123456789 | 1973-11-29 21:33:09 Thu |
| 987654321 | 2001-04-19 04:25:21 Thu |
+-----------+------------------------------------+
2 rows in set (0.00 sec)
对字符串格式化
如下示例是将一个字符串型的日期值进行格式化,将字符串型的日期值格式化为"yyyy-mm-dd" 的组合结果返回给用户。通过兼容格式符号列表可知,可选择如下格式符号。
create table t_str_to_date(id int,c_d varchar(50));
insert into t_str_to_date values(1,'2024-01-08 10:25:50');
insert into t_str_to_date values(2,'2023-01-08 17:10:47');
--StoneDB
> select c_d,str_to_date(c_d,'%Y-%m-%d') from t_str_to_date;
+---------------------+-----------------------------+
| c_d | str_to_date(c_d,'%Y-%m-%d') |
+---------------------+-----------------------------+
| 2024-01-08 10:25:50 | 2024-01-08 |
| 2023-01-08 17:10:47 | 2023-01-08 |
+---------------------+-----------------------------+
2 rows in set (0.00 sec)
--MySQL
> select c_d,str_to_date(c_d,'%Y-%m-%d') from t_str_to_date;
+---------------------+-----------------------------+
| c_d | str_to_date(c_d,'%Y-%m-%d') |
+---------------------+-----------------------------+
| 2024-01-08 10:25:50 | 2024-01-08 |
| 2023-01-08 17:10:47 | 2023-01-08 |
+---------------------+-----------------------------+
2 rows in set, 2 warnings (0.00 sec)
对日期格式化
如下示例是将一个日期时间值进行格式化,将日期时间值格式化为 "年:月:日 week 第几周" 的组合结果返回给用户。通过兼容格式符号列表可知,可选择如下格式符号。
create table t_date_format(c_d datetime);
insert into t_date_format values('2024-02-06 12:37:33');
--StoneDB
> select c_d,date_format(c_d,'%Y年-%m月-%d日 %a %U') from t_date_format;
+---------------------+--------------------------------------------+
| c_d | date_format(c_d,'%Y年-%m月-%d日 %a %U') |
+---------------------+--------------------------------------------+
| 2024-02-06 12:37:33 | 2024年-02月-06日 Tue 05 |
+---------------------+--------------------------------------------+
1 row in set (0.01 sec)
--MySQL
> select c_d,date_format(c_d,'%Y年-%m月-%d日 %a %U') from t_date_format;
+---------------------+--------------------------------------------+
| c_d | date_format(c_d,'%Y年-%m月-%d日 %a %U') |
+---------------------+--------------------------------------------+
| 2024-02-06 12:37:33 | 2024年-02月-06日 Tue 05 |
+---------------------+--------------------------------------------+
1 row in set (0.00 sec)
对时间格式化
如下示例是将一个日期时间值进行格式化,将日期时间值格式化为 "12hh:mm:ss AM/PM" 的组合结果返回给用户。通过兼容格式符号列表可知,可选择如下格式符号。
create table t_time_format(c_d datetime);
insert into t_time_format values('2024-02-06 12:37:33');
--StoneDB
> select c_d,time_format(c_d,'%r') from t_time_format;
+---------------------+-----------------------+
| c_d | time_format(c_d,'%r') |
+---------------------+-----------------------+
| 2024-02-06 12:37:33 | 12:37:33 PM |
+---------------------+-----------------------+
1 row in set (0.00 sec)
--MySQL
> select c_d,time_format(c_d,'%r') from t_time_format;
+---------------------+-----------------------+
| c_d | time_format(c_d,'%r') |
+---------------------+-----------------------+
| 2024-02-06 12:37:33 | 12:37:33 PM |
+---------------------+-----------------------+
1 row in set (0.00 sec)

加入微信群(左):添加社区助理-小石侠;加入钉钉群(右):扫描下方钉钉群二维码。
点击阅读原文,给 StoneDB 点个 Star 鼓励一下吧~






