teradata - Teradata 中的日期差异
问题描述
我有一个 Teradata 表,它有 2 个 Varchar 列,它们都有如下数据
Col 1 :08/09/2017 01:03:20 PM
和其他一个
Col 2 :09/09/2017 01:03:20 PM
我该怎么做日期差异
简单( col1- col2 )对我没有帮助。
解决方案
首先,如果您对此表或 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)
另一种选择是(在转换为时间戳之后),将它们推入 aPERIOD()
并找到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
在加载时将类型存储在表上可能是个好主意,这样您就可以INTERVAL(my_period_column) DAY(4)
在您的SQL。
推荐阅读
- aws-lambda - 如何在 AWS lambda 中使用 gifsicle
- reactjs - 反应获取状态
- reactjs - 如何使用 Redux 建立商店
- assembly - 在 MIPS 中将行号添加到输出文件
- visual-studio - 用于客户端 Web 应用程序 Visual Studio 或 VSCode 的 IDE?
- flutter - 带有 NullSafety 的 Flutter 中的单例类
- c# - 创建一个子游戏对象的副本,并在删除父游戏对象时它仍然存在
- python - 如何以相同的纵横比和请求的大小放置小部件的轴?
- python - 当是参数时,Python apply_async() 不会运行
- api - 如何使用 zoom API 获取 Zoom 会议详情报告?