Hadoop SQL 中时间戳数据类型的奇怪行为
Posted
技术标签:
【中文标题】Hadoop SQL 中时间戳数据类型的奇怪行为【英文标题】:Strange behaviour on timestamp data type in Hadoop SQL 【发布时间】:2022-01-19 14:14:13 【问题描述】:我正在尝试在 Hadoop 数据库中获取以下条件的记录:
select
CUSTOMER_SITE_NBR as account_site_nbr,
SITE_USE_ID as account_site_use_id,
CREATION_DATE_TIME as create_date_time,
LAST_UPDATE_DATE_TIME as main_source_last_update_date_time
from hub_customer.dim_site_use_mdm
where cast (CREATION_DATE_TIME as date)
BETWEEN '2020-02-01' and '2020-02-29' and cast (LAST_UPDATE_DATE_TIME as date) = '2020-02-28' and
site_use_code <> 'HEADQUARTER' order by
account_site_nbr,
account_site_use_id,
create_date_time,
main_source_last_update_date_time;
返回的记录如下:
如您所见,main_source_last_update_date_time 列将时间戳中的所有时间部分返回为 00:00:00。我们数据库中的数据很少有 00:00:00 的时间戳。
我又测试了两种情况:
案例 1:这给出了错误的结果
select
CUSTOMER_SITE_NBR as account_site_nbr,
SITE_USE_ID as account_site_use_id,
CREATION_DATE_TIME as create_date_time,
LAST_UPDATE_DATE_TIME as main_source_last_update_date_time
from hub_customer.dim_site_use_mdm
where cast (CREATION_DATE_TIME as date)
BETWEEN '2020-02-01' and '2020-02-29' and cast (LAST_UPDATE_DATE_TIME as date) = '2020-02-28' and
site_use_code <> 'HEADQUARTER' AND SITE_USE_ID = '100000010853754' order by
account_site_nbr,
account_site_use_id,
create_date_time,
main_source_last_update_date_time;
案例 2:
select
CUSTOMER_SITE_NBR as account_site_nbr,
SITE_USE_ID as account_site_use_id,
CREATION_DATE_TIME as create_date_time,
LAST_UPDATE_DATE_TIME as main_source_last_update_date_time
from hub_customer.dim_site_use_mdm where
SITE_USE_ID = '100000010853754'
正确的数据是第二种情况。 SELECT 语句中没有 CAST。似乎 main_source_last_update_date_time 列已转换为 DATE,然后又转换回时间戳 - 因此,它可能会在记录中给出 00:00:00。该问题仅出现在此表中,因为我们有其他具有类似 SQL 查询的表,并且它们提供了更正的结果。
如何找到此问题的原因以及解决此问题的正确方法是什么?
亲切的问候,
【问题讨论】:
【参考方案1】:您是否尝试将 LAST_UPDATE_DATE_TIME 转换为时间戳(在选择中)
select
CUSTOMER_SITE_NBR as account_site_nbr,
SITE_USE_ID as account_site_use_id,
CREATION_DATE_TIME as create_date_time,
LAST_UPDATE_DATE_TIME as main_source_last_update_date_time
from
hub_customer.dim_site_use_mdm
where
to_date(CREATION_DATE_TIME) > '2020-02-01' and '2020-02-29'
and
to_date(LAST_UPDATE_DATE_TIME) = '2020-02-28'
and
site_use_code <> 'HEADQUARTER'
order by
account_site_nbr,
account_site_use_id,
create_date_time,
main_source_last_update_date_time;
【讨论】:
是的,我试过了,但它仍然在时间戳中返回 00:00:00,我不确定这是 SQL Hadoop 中的设置还是数据库的一些意外行为。 这是一种常见的行为,尝试使用函数来解决它。以上是关于Hadoop SQL 中时间戳数据类型的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章