Teradata中的日期差异
我有一个Teradata表,它有两个Varchar列,它们都有如下数据 第1列:Teradata中的日期差异,teradata,Teradata,我有一个Teradata表,它有两个Varchar列,它们都有如下数据 第1列:08/09/2017 01:03:20 PM和类似的另一个 第二栏:2017年9月9日01:03:20下午 我怎样做日期差异 Simple(col1-col2)对我没有帮助。首先,如果您可以控制此表或ETL,建议不要将时间戳存储为varchar,因为您不能减去两个字符串,无论它们看起来有多像数字或日期 您需要做的是将这两列转换为时间戳,指定它们当前的格式。一旦施法,您可以减去它们以获得表示日期之间天数的间隔类型 SE
08/09/2017 01:03:20 PM
和类似的另一个第二栏:
2017年9月9日01:03:20下午
我怎样做日期差异
Simple(col1-col2)对我没有帮助。首先,如果您可以控制此表或ETL,建议不要将时间戳存储为varchar,因为您不能减去两个字符串,无论它们看起来有多像数字或日期 您需要做的是将这两列转换为
时间戳
,指定它们当前的格式。一旦施法,您可以减去它们以获得表示日期之间天数的间隔
类型
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\u列)DAY(4)
谢谢你的回复。第一种选择对我有效,我会用第一种选择接受你的建议。谢谢Again@VinayakDas只有一个可能的问题,如果差异超过4天,您将得到一个*间隔溢出错误。如果当前的计算是您想要的,并且您只需要几天,您可以尝试选择Cast(Substr('09/09/2017 01:03:20 PM',1,10)作为日期格式“mm/dd/yyyy”)-Cast(Substr('08/09/2017 01:03:20 PM',1,10)作为日期格式“mm/dd/yyyyy”)
@dnoeth您的意思是“如果日差超过4位数”<代码>天(4)
应该在9999
天或大约27
年内有效。@jnevil:当然,应该是4位数字。27年是很长的一段时间,但是你可能有一个非常低/高的日期指示无限大,或者你只是得到了坏数据。我对同一数据集有另一个问题,要求是从数据集中用“FW”和“Week”表示年份。因此,结果将是eg:-2019FW26。我如何从上面的例子中得到它?我在这里也将它转换为时间戳吗?