所以我有一个疑问,我一直在疯狂地尝试去工作,我觉得它应该很容易,但是我错了很多。
我有两个字段要与不到两个小时的系统日期进行比较。因此,基本上,过去两个小时内发生的所有事情。 日期是日期数据类型,而时间是文本数据类型。
这是我尝试执行它的多种方法之一;
SELECT *
FROM
ExampleTable
WHERE
TO_DATE( DateField || ' ' || TimeField ) >= sysdate -(2/24)
我还尝试过转换TO_DATE()中的每个字段,仅转换时间,使用TO_DATE和TO_TIMESTAMP以及许多其他变体来转换所有时间和sysdate。所有输出都会引发数据类型不一致的错误。
如果可以,请协助!
答案 0 :(得分:1)
我没有一个可以处理的字符字段的TimeField。在OpenEdge环境中,通常的做法是将时间存储为整数(午夜后的秒数),然后以所需的格式显示它:string(TimeField,“ HH:MM:SS”)。
如果是整数,则可以使用以下SQL。
SELECT *
FROM ExampleTable
WHERE TIMESTAMPDIFF( SQL_TSI_HOUR, TIMESTAMPADD( SQL_TSI_SECOND, TimeField, DateField ), NOW() ) <= 2
如果您的TimeField确实是一个字符字段,则可以使用:
SELECT *
FROM ExampleTable
WHERE
TIMESTAMPDIFF(
SQL_TSI_HOUR,
TO_TIMESTAMP( CONCAT( CONCAT( TO_CHAR( DateField ), ' ' ), TimeField ) ),
NOW()
) <= 2
但是既然这样无论如何看起来都将是一次完整的表扫描,那么您可能想要添加一个普通的where子句以将结果限制为最后两天。
AND DateField > CURDATE() - 2