请将SQL Server代码转换为Oracle吗?

时间:2016-06-23 18:14:25

标签: sql oracle

从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语法...我们已经尝试过几件事但它失败了:(

谢谢,

戴夫

3 个答案:

答案 0 :(得分:4)

您可以在Oracle中将其写为:

SELECT *
FROM TABLENAME
WHERE TRUNC(LAST_MODIFIED) > (DATE '1990-01-01') - 2

注意:

  • 在Oracle中,DATE包含一个时间组件,因此强制转换为日期无效。
  • Oracle支持各种方式来包含日期/时间常量。我更喜欢关键字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;