Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Teradata中的日期差异_Teradata - Fatal编程技术网

Teradata中的日期差异

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

我有一个Teradata表,它有两个Varchar列,它们都有如下数据

第1列:
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。我如何从上面的例子中得到它?我在这里也将它转换为时间戳吗?