【问题标题】:Strange behaviour on timestamp data type in Hadoop SQLHadoop 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 查询的表,并且它们提供了更正的结果。

如何找到此问题的原因以及解决此问题的正确方法是什么?

亲切的问候,

【问题讨论】:

    标签: sql hadoop timestamp


    【解决方案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 中的设置还是数据库的一些意外行为。
    • 这是一种常见的行为,尝试使用函数来解决它。
    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多