【问题标题】:Date Difference in TeradataTeradata 中的日期差异
【发布时间】:2020-03-09 09:32:17
【问题描述】:

我有一个包含 2 个 Varchar 列的 Teradata 表,它们都有如下数据

Col 1 :08/09/2017 01:03:20 PM 和其他类似
第 2 列:09/09/2017 01:03:20 PM

我该如何做日期差异

简单 (col1- col2) 对我没有帮助。

【问题讨论】:

  • 我对同一个数据集有另一个问题,要求是用“FW”和周从数据集中连接年份。所以结果将是例如:-2019FW26。如何从上面的示例中实现这一点,我是否也将其转换为时间戳?

标签: teradata


【解决方案1】:

首先,如果您对此表或 ETL 有任何控制权,建议您不要将时间戳存储为 varchar,因为无论它们看起来多么像数字或日期,您都无法减去两个字符串。

您需要做的是将这两列转换为 TIMESTAMP,指定它们当前所在的 FORMAT。转换后,您可以减去它们以获得代表天数的 INTERVAL 类型日期之间。

SELECT (CAST('09/09/2017 01:03:20 PM' AS TIMESTAMP FORMAT 'mm/dd/yyyybhh:mi:ssbt') - CAST('08/09/2017 01:03:20 PM' AS TIMESTAMP FORMAT 'mm/dd/yyyybhh:mi:ssbt')) DAY(4)

另一种选择是(在转换为时间戳之后),将它们推入 PERIOD() 并找到该时期的 INTERVAL()

SELECT INTERVAL(PERIOD(CAST('08/09/2017 01:03:20 PM' AS TIMESTAMP FORMAT 'mm/dd/yyyybhh:mi:ssbt'), NEXT(CAST('09/09/2017 01:03:20 PM' AS TIMESTAMP FORMAT 'mm/dd/yyyybhh:mi:ssbt')))) DAY(4) 

第一个选项的性能会更好,因为对数据的干扰更少,但如果您经常这样做,那么在加载时将 PERIOD 类型存储在表上可能是个好主意你可以在你的 SQL 中做INTERVAL(my_period_column) DAY(4)

【讨论】:

  • 非常感谢您的回复。第一个选项对我有用,我将使用第一个选项接受您的建议。再次感谢
  • @VinayakDas 只有一个可能的问题,如果差异超过 4 天,您将收到 *interval 溢出错误。如果当前的计算是你想要的,你只需要几天,你可以试试SELECT Cast(Substr('09/09/2017 01:03:20 PM', 1, 10) AS DATE FORMAT 'mm/dd/yyyy') - Cast(Substr('08/09/2017 01:03:20 PM', 1, 10) AS DATE FORMAT 'mm/dd/yyyy')
  • @dnoeth 您的意思是“如果天数相差超过 4 位”? day(4) 应该可以持续到 9999 天或 27 年左右。
  • @JNevill:当然应该是4位数。 27 年很多,但您可能有一个非常低/高的日期指示无穷大,或者您只是得到了错误的数据
猜你喜欢
  • 2014-04-05
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2018-11-23
  • 2021-06-15
  • 1970-01-01
相关资源
最近更新 更多