我遇到了很多SQL问题,当它们被
timestamp
给出时
我的大部分查询都使用
CAST
。我想知道 CAST
和 TRUNC
之间的区别
什么场景什么时候用什么?
CAST
用于从一种数据类型更改为另一种数据类型。TRUNC
用于将数字或 DATE
或 TIMESTAMP
数据类型截断为给定精度。假设,由于您提到
timestamp
,您正在关注日期时间数据类型。
A
DATE
是一种二进制数据类型,包含:
A
TIMESTAMP
是一种二进制数据类型,包含:
DATE
和 TIMESTAMP
ALWAYS 都有最初的 7 个字节。
CAST
当您使用
CAST(timestamp_value AS DATE)
时,您要求 Oracle 从 TIMESTAMP
对象的前 7 个(强制)字节创建一个 7 字节的二进制对象。
所以:
CAST(TIMESTAMP '2001-02-03 04:05:06.007 UTC' AS DATE)
将产生值为
DATE
的 2001-02-03 04:05:06
(丢弃秒小数部分和 UTC 时区)。
TRUNC
TRUNC
函数具有签名TRUNC(date_or_timestamp_value, format_model)
并返回DATE
数据类型,其二进制组件比设置为最小值的format_model
参数更精确(0表示时间组件,1表示月份和日期)。
所以:
TRUNC(TIMESTAMP '2001-02-03 04:05:06.007 UTC', 'DD')
将产生值为
DATE
的 2001-02-03 00:00:00
(丢弃小数秒和 UTC 时区,并将当天的组件设置得更精确 - 即小时、分钟和秒 - 为 0)。
和
TRUNC(TIMESTAMP '2001-02-03 04:05:06.007 UTC', 'YY')
将产生值为
DATE
的 2001-01-01 00:00:00
(丢弃小数秒和 UTC 时区,并将当年更精确的组件设置为最小值 - 因此,小时、分钟和秒为 0,天和月为 1 ).
什么场景什么时候用什么?
如果您想要
GROUP BY
天,那么您不想使用CAST
,因为当您CAST(timestamp_value AS DATE)
时它不会删除时间部分。相反,您想使用 TRUNC(timestamp_value, 'DD')
- 您仍然有一个时间部分,但当天的所有值都将有一个午夜时间,因此它们都会被分组在一起。