ANSI DATETIME上的无效操作(在Teradata中从另一个时间戳中减去一个时间戳)

时间:2014-05-07 17:41:38

标签: sql datetime teradata

我想创建一个WHERE条件来返回两个时间戳之间仅过了1天的结果。我试过这个:

SELECT * FROM RDMAVWSANDBOX.VwNIMEventFct
INNER JOIN VwNIMUserDim ON VwNIMUserDim.NIM_USER_ID = VwNIMEventFct.NIM_USER_ID
INNER JOIN rdmatblsandbox.TmpNIMSalesForceDB ON TmpNIMSalesForceDB.EMAIL = VwNIMUserDim.USER_EMAIL_ADDRESS
WHERE (CONTRACT_EFFECTIVE_DATE - EVENT_TIMESTAMP) =1

但结果是一条错误消息" ANSI DATETIME值无效操作"。

我想,现在看看代码,Teradata无法知道" 1" in" = 1"是一天,一小时或一年。

如何选择CONTRACT_EFFECTIVE_DATE和EVENT_TIMESTAMP之间仅过了1天的数据?

再过2天,3天等?

2 个答案:

答案 0 :(得分:1)

如果两列都是DATE,您可以使用=1,这意味着有一天。

对于时间戳,您需要告诉您想要什么样的间隔:

WHERE (CONTRACT_EFFECTIVE_DATE - EVENT_TIMESTAMP) DAY = INTERVAL '1' DAY

但是,如果这是你真正想要的,那么 1天的定义是什么?

修改

根据您的评论,最佳方式应该是:

WHERE CAST(CONTRACT_EFFECTIVE_DATE AS DATE) - CAST(EVENT_TIMESTAMP AS DATE) = 1

这避免了处理INTERVAL算法: - )

答案 1 :(得分:1)

不确定Teradata,但我认为大多数SQL版本都有内置的日期数学函数。例如,在MSSQL中,您可以这样做:

...
WHERE DATEDIFF(DAY, CONTRACT_EFFECTIVE_DATE, EVENT_TIMESTAMP) = 1

或者,如果你想确保24小时过去,你可以这样做:

...
WHERE DATEDIFF(HOUR, CONTRACT_EFFECTIVE_DATE, EVENT_TIMESTAMP) = 1

其他SQL有自己的版本,你可能不得不使用'D'或'DD'而不是'DAY'或其他东西(也可能是'HH'而不是'HOUR')。