我想创建一个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天等?
答案 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')。