从SQL Server到Oracle的SQL转换存在一些问题。
我们传入的是datetime值(在此示例中仅为1900-01-01),我们需要选择在日期传递之前修改日期大于2天的所有行。以下是可用的SQL语法:
SELECT *
FROM TABLENAME
WHERE CAST(LAST_MODIFIED AS DATE) > CAST(DATEADD(dd, -2, '1990-01-01') AS DATE);
其中LAST_MODIFIED
是一列,而'1900-01-01'
是在执行之前被注入C#中的SQL字符串的值。在被问到之前,我们不希望在将它传递给SQL之前的2天内减去它:)
那么我们需要的只是将上面的查询转换为Oracle语法...我们已经尝试过几件事但它失败了:(
谢谢,
戴夫
答案 0 :(得分:4)
您可以在Oracle中将其写为:
SELECT *
FROM TABLENAME
WHERE TRUNC(LAST_MODIFIED) > (DATE '1990-01-01') - 2
注意:
DATE
包含一个时间组件,因此强制转换为日期无效。DATE
,其ISO / ANSI标准日期格式为YYYY-MM-DD。- 2
可能更准确地写为- interval '2' day
。但是,区间符号对Oracle来说是新的(ish)。而且,在任何一个数据库中都可以更好地编写它而不修改last_modified_date
:
SELECT *
FROM TABLENAME
WHERE LAST_MODIFIED >= (DATE '1990-01-01') - 1
使用正确的日期比较,不需要删除时间组件。
答案 1 :(得分:1)
SELECT *
FROM TABLENAME
WHERE CAST(LAST_MODIFIED AS DATE) > TO_DATE('1990-01-01','YYYY-MM-DD')-2;
答案 2 :(得分:0)
SELECT *
FROM TABLENAME
WHERE TRUNC( LAST_MODIFIED ) > TO_DATE( '1990-01-01', 'YYYY-MM-DD' ) - 2;
或者,如果使用:date_value
绑定变量传递值:
SELECT *
FROM TABLENAME
WHERE TRUNC( LAST_MODIFIED ) > :date_value - 2;
如果您传递给查询的值没有时间组件,那么您可以这样做:
SELECT *
FROM TABLENAME
WHERE LAST_MODIFIED >= :date_value - 1;