CAST 和 TRUNC 的区别

问题描述 投票:0回答:1

我遇到了很多SQL问题,当它们被

timestamp
给出时

我的大部分查询都使用

CAST
。我想知道
CAST
TRUNC

之间的区别

什么场景什么时候用什么?

oracle
1个回答
0
投票
  • CAST
    用于从一种数据类型更改为另一种数据类型。
  • TRUNC
    用于将数字或
    DATE
    TIMESTAMP
    数据类型截断为给定精度。

假设,由于您提到

timestamp
,您正在关注日期时间数据类型。

A

DATE
是一种二进制数据类型,包含:

  • 7 个字节代表世纪、世纪年份、月、日、小时、分钟和秒。

A

TIMESTAMP
是一种二进制数据类型,包含:

  • 7个字节代表世纪、世纪年份、月、日、时、分、秒;
  • 0-6 个可选字节,表示秒的小数部分;和
  • 如果有时区部分,则 7 个字节代表时区。

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')
- 您仍然有一个时间部分,但当天的所有值都将有一个午夜时间,因此它们都会被分组在一起。

© www.soinside.com 2019 - 2024. All rights reserved.