日期算术 - 日期之间的差异,以日期,小时,分钟和/或秒为单位
在oracle中,使用减法可以得到两个DATE
之间的差(以days和/或fractions表示):
|
|
输出两个日期之间的天数:
|
|
和:
|
|
输出两个日期之间的天数分数:
|
|
通过将该数字乘以24,24 * 60
或24 * 60 * 60
可以得到小时,分钟或秒的差异。
可以更改上一个示例,以获取两个日期之间的日期,小时,分钟和秒数:
|
|
(注意:使用TRUNC()
而不是FLOOR()
来正确处理负差异。)
输出:
|
|
上一个示例也可以通过使用NUMTODSINTERVAL()
将数字差异转换为间隔来解决:
|
|
设置默认日期格式模型
当Oracle隐式地从DATE
转换为字符串或反之亦然时(或在没有格式模型的情况下显式调用TO_CHAR()
或TO_DATE()
时),NLS_DATE_FORMAT
会话参数将用作转换中的格式模型。 如果文本不匹配格式模型,则会引发异常。
你可以使用以下命令查看此参数:
|
|
你可以使用以下方式在当前会话中设置此值:
|
|
(注意:这不会更改任何其他用户的值。)
如果你依靠NLS_DATE_FORMAT
在TO_DATE()
或TO_CHAR()
中提供格式掩码,那么当你的查询中断,如果这个值被改变你不应该感到惊讶。
日期算术 - 日期之间的差异(以月或年为单位)
可以使用MONTHS_BETWEEN( date1, date2 )
找到两个日期之间的月份差异:
|
|
输出:
|
|
如果差异包括部分月份,则它将返回基于每月有31天的月份分数:
|
|
输出:
|
|
由于MONTHS_BETWEEN
假设每月31天,因为每月可能有较少的天数,则这可能会导致跨越月份之间边界的差异值不同。
例:
|
|
输出:
|
|
可以通过将月差除以12来找到年的差异。
更改SQL / Plus或SQL Developer显示日期的方式
当SQL / Plus或SQL Developer显示日期时,它们将使用默认日期格式模型对字符串执行隐式转换(请参阅设置默认日期格式模型示例)。
你可以通过更改NLS_DATE_FORMAT
参数来更改日期的显示方式。
将日期转换为字符串
使用TO_CHAR( date [, format_model [, nls_params]] )
:
(注意:如果不提供格式模型,那么将使用NLS_DATE_FORMAT
会话参数作为默认格式模型;对于每个会话都可以使用不同的格式模型,因此不应该依赖它),最好始终指定格式模型。
|
|
然后:
|
|
输出:
|
|
和:
|
|
输出:
|
|
提取日期的年,月,日,小时,分钟或秒成分
可以使用EXTRACT( [ YEAR | MONTH | DAY ] FROM datevalue )
找到DATE数据类型的年,月或日组件
|
|
输出:
|
|
组件的时间(小时,分钟或秒)可以通过以下任一方式找到:
- 使用
CAST( datevalue AS TIMESTAMP )
将DATE
转换为TIMESTAMP
,然后使用EXTRACT( [ HOUR | MINUTE | SECOND ] FROM timestampvalue )
; 要么 - 使用
TO_CHAR( datevalue, format_model )
将值作为字符串获取。
例如:
|
|
输出:
|
|
使用时间组件生成日期
使用TO_DATE()
将它从字符串文字转换:
|
|
或使用TIMESTAMP
文字:
|
|
当将其存储在表的DATE
列中时,Oracle会将TIMESTAMP
隐式转换为DATE
; 但是你可以显式地将CAST()
的值改为DATE
:
|
|
生成没有时间组件的日期
所有DATE
都有时间组件; 然而,通常存储不需要包括具有设置为零(即,午夜)的小时/分钟/秒的时间信息的日期。
使用ANSI DATE
文本(使用ISO 8601日期格式):
|
|
使用TO_DATE()
将它从字符串文字转换:
|
|
(有关日期格式模型的更多信息,请参见Oracle文档。)
要么:
|
|
(如果你要转换特定于语言的术语(如月份名称),那么最好将第3个nlsparam参数包含在TO_DATE()
函数中,并指定期望的语言。
日期的格式
在Oracle中,DATE
数据类型没有格式; 当Oracle向客户端程序(SQL/Plus,SQL/Developer,Toad,Java,Python等)发送DATE
时,它将发送表示日期的7-或8-字节。
未存储在表中的DATE
(即,由SYSDATE
生成并且在使用DUMP()
命令时具有“type 13”)具有8个字节并具有结构(右边的数字是2012-11-26 16:41:09
的内部表示):
|
|
存储在表(在使用DUMP()
命令时为“type 12”)的DATE
具有7个字节并具有结构(右侧的数字是2012-11-26 16:41:09
的内部表示 ):
|
|
如果你想让日期有一个特定的格式,那么你需要将它转换为具有格式(即字符串)的东西。 SQL客户端可以隐式地执行此操作,或者可以使用TO_CHAR( date, format_model, nls_params )
将值显式转换为字符串。
时区和夏令时
DATE
数据类型不处理时区或夏令时的更改。
或者:
- 使用
TIMESTAMP WITH TIME ZONE
数据类型; 要么 - 处理应用程序逻辑中的更改。
DATE
可以存储为协调世界时(UTC),并转换为当前会话时区,如下所示:
|
|
如果运行ALTER SESSION SET TIME_ZONE = '+01:00'
; 那么输出是:
|
|
和ALTER SESSION SET TIME_ZONE ='PST'
; 那么输出是:
|
|