Beaver's Blog

Freedom Openness Inclusion

0%

关系型数据库日期类型转换

在数据库中,日期类型属于最经常使用的类型之一。在很多场景中都会遇到日期类型转换问题,在关系型数据库中日期转换函数有很多,但这些数据库日期转换函数不能通用,接下来就以OracleMySQLSQL Server这3个常见的关系型数据库为例,简单介绍一下日期转换函数的使用。

这3个关系型数据库常见的日期转换函数有:OracleTO_DATETO_CHARMySQLSQL Serverconvert等函数。

Oralce日期转换

Oracle中,日期转换常用的函数是to_char[1]to_date[2],一个可以将其日期转换为字符型,另一个可以将字符型转换为日期型。以下是他们的基本语法格式:

1
2
3
TO_CHAR(expr, fmt[ ,nlsparam] ) -> varchar2
TO_DATE(expr, fmt[ ,nlsparam] ) -> date_type
nlsparam: 用于指定国家日期格式

现在分别讲解一下这两个函数的用法:

1
2
3
4
5
6
7
8
9
-- TO_CHAR()
SELECT TO_CHAR(sysdate, 'yyyy-mm-dd') FROM dual; -- 2021-06-11
SELECT TO_CHAR(sysdate, 'hh24:mi:ss') FROM dual; -- 20:15:30
-- TO_DATE()
SELECT TO_DATE('2020-12-23', 'yyyy-mm-dd') FROM dual; -- 2020-12-23 00:00:00
SELECT TO_DATE('2020-12-23 12:12:00', 'yyyy-mm-dd hh24:mi:ss') FROM dual;
-- 设置了nlsparam的用法
SELECT TO_DATE('January 15, 1989, 11:00 A.M.','Month dd, YYYY, HH:MI A.M.',
'NLS_DATE_LANGUAGE = American') FROM DUAL;

上面只是讲解了这两个函数最常见的一些用法,更详细的用法参见References[1]-[2]。

SQL SERVER日期转换

SQL Server中使用的日期转换函数是CONVERT[3],其基本语法格式是:

1
CONVERT( type [ (length) ], expression [ , style ] )

语法中length是目标类型的长度,通过长度的设置可以截取我们所需要的格式,而通过style的值实现不同格式的转换(具体使用见References[5])。

现在举例讲解一下CONVERT函数在SQL Server中的用法

1
2
3
4
5
6
7
-- 日期转字符串
SELECT CONVERT(VARCHAR(10), GETDATE(), 120); -- 2021-06-11
SELECT CONVERT(VARCHAR, GETDATE(), 120); -- 2021-06-11 20:25:32
SELECT CONVERT(VARCHAR, GETDATE(), 101); -- 06/25/2021
-- 字符串转日期
SELECT CONVERT(DATETIME, '2021-10-22', 101);
SELECT CONVERT(TIME,'20:20:36',114);

SQL ServerCONVERT函数已经能非常灵活的达到多种格式转换的目的,通过控制type_lengthstyle的值能够获取我们想要的各种格式。

MySQL日期转换

MySQL中实现日期转换操作,可以通过CONVERT[6]函数实现字符串转日期,通过DATE_FORMAT[3]实现日期转字符串。

函数的基本语法格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- string_to_date
CONVERT(expr, type)
type: DATE, DATETIME, TIME
-- date_to_string
DATE_FORMAT(date_expr, fmt)
fmt:
%d Day of the month as a numeric value (01 to 31)
%f Microseconds (000000 to 999999)
%H Hour (00 to 23)
%h Hour (00 to 12)
%i Minutes (00 to 59)
%M Month name in full (January to December)
%m Month name as a numeric value (00 to 12)
%S/%s Seconds (00 to 59)
%Y Year as a numeric, 4-digit value
%y Year as a numeric, 2-digit value

下面举例解释一下这两个函数:

1
2
3
4
5
6
-- CONVERT
SELECT CONVERT("20:13:45", TIME)
SELECT CONVERT("2021-03-10", DATE)
-- DATE_FORMAT
SELECT DATE_FORMAT(NOW(), "%Y-%m-%d"); -- 2021-06-11
SELECT DATE_FORMAT('2007-10-04 22:23:00', '%H:%i:%s'); -- '22:23:00'

CONVERT函数实现了将时间字符串转成TIMEDATE等类型,DATE_FORMAT函数与OracleTO_CHAR用法非常类型,这里就不多做过多的赘述了。

CAST函数

其实CAST函数不是一个只用于日期转换的函数,很多类型都可以通过这个函数进行类型转换,比如:字符串转数值型,日期转字符串等。以下是CAST函数的语法知识:

1
2
-- CAST Syntax:  
CAST ( expression AS data_type [ ( length ) ] )

而且Oracle[5]MySQL[6]SQL Server[4]都实现了对CAST函数的支持。但是本文只讲该函数对日期类型转换的操作部分。

1
2
3
4
5
6
7
8
-- Oracle
SELECT CAST('22-OCT-1997' AS TIMESTAMP WITH LOCAL TIME ZONE) FROM dual;
SELECT CAST(sysdate AS VARCHAR2(30)) FROM dual;
-- MySQL
SELECT CAST("2017-08-29" AS DATETIME);
SELECT CAST("14:06:10" AS TIME);
-- SQL Server
SELECT CAST('2014-05-02' AS date); -- '2014-05-02'

总结

本文简单的介绍了一些常见的关系型数据库涉及日期转换的函数,其中大部分函数可移植性较差,是不能跨数据库使用的,这一点需要注意下。CAST函数将日期类型转换为字符串类型,不能够灵活的格式化。对于函数使用的出处,参见参考文献中官方文档详细的解释。

References

[1] Oracle: TO_CHAR

[2] Oracle: TO_DATE

[3] MySQL8.0 Date and Time Functions: DATE_FORMAT

[4] CAST 和 CONVERT - SQL Server | Microsoft Docs

[5] Oracle: CAST Function

[6] MySQL8.0 Cast Functions and Operators