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 中时间戳数据类型的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDB中时间戳的数据类型[重复]

如何使用 SQL 显示两个不同区域中时间戳之间的实时差异?

Android中时间戳的详细解释

计算一列中时间戳之间的持续时间

数组中时间戳之间的平均间隔

放置在表格单元格中时出现奇怪的 iframe 高度行为