Sql 查找两个日期之间的日期(最佳实践)

Sql 查找两个日期之间的日期(最佳实践),sql,oracle,date,Sql,Oracle,Date,我有两个SQL脚本。像这样的人: "Date" > '2014-04-11' AND "Date" <= '2014-04-12' "Date" BETWEEN '2014-04-11' AND '2014-04-12' 现在,我想知道是否有任何具体的最佳实践,一个原因是做一个比另一个好,如果其中一个是更好的某种明显的原因,我错过了路的某个地方 您要求的是最佳实践。我认为以下是最佳实践: "Date" >= DATE '2014-04-11' AND &

我有两个SQL脚本。像这样的人:

"Date" > '2014-04-11' AND "Date" <= '2014-04-12'
"Date" BETWEEN '2014-04-11' AND '2014-04-12'

现在,我想知道是否有任何具体的最佳实践,一个原因是做一个比另一个好,如果其中一个是更好的某种明显的原因,我错过了路的某个地方

您要求的是最佳实践。我认为以下是最佳实践:

"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
事实上:

"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
也就是说,从后面的日期算起,正好有一次是在午夜的第一个瞬间。这通常不是你想要的。Oracle通过两种方式使此问题变得更糟:

日期数据类型包括时间组件。 显示日期值的默认方式没有时间组件。 因此,为了安全起见,请使用以下规则:

不要在日期之间使用。 使用>=作为第一个日期。
用户您要求的是最佳实践。我认为以下是最佳实践:

"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
事实上:

"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
也就是说,从后面的日期算起,正好有一次是在午夜的第一个瞬间。这通常不是你想要的。Oracle通过两种方式使此问题变得更糟:

日期数据类型包括时间组件。 显示日期值的默认方式没有时间组件。 因此,为了安全起见,请使用以下规则:

不要在日期之间使用。 使用>=作为第一个日期。 使用者 在以下两者之间使用:

SQL> set autotrace traceonly
SQL> select * from date_tab where d between sysdate + 1 and sysdate + 3;


Execution Plan
----------------------------------------------------------
Plan hash value: 290508398

...

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYSDATE@!+1<=SYSDATE@!+3)
   2 - filter("D">=SYSDATE@!+1 AND "D"<=SYSDATE@!+3)
使用日期间隔:

SQL> select * from date_tab where d > sysdate + 1 and d <= sysdate + 3;


Execution Plan
----------------------------------------------------------
Plan hash value: 290508398

...

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYSDATE@!+1<SYSDATE@!+3)
   2 - filter("D">SYSDATE@!+1 AND "D"<=SYSDATE@!+3)
如您所见,oracle optimizer将between谓词重写为D>=SYSDATE@+1和D 在以下两者之间使用:

SQL> set autotrace traceonly
SQL> select * from date_tab where d between sysdate + 1 and sysdate + 3;


Execution Plan
----------------------------------------------------------
Plan hash value: 290508398

...

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYSDATE@!+1<=SYSDATE@!+3)
   2 - filter("D">=SYSDATE@!+1 AND "D"<=SYSDATE@!+3)
使用日期间隔:

SQL> select * from date_tab where d > sysdate + 1 and d <= sysdate + 3;


Execution Plan
----------------------------------------------------------
Plan hash value: 290508398

...

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYSDATE@!+1<SYSDATE@!+3)
   2 - filter("D">SYSDATE@!+1 AND "D"<=SYSDATE@!+3)

如您所见,oracle optimizer将between谓词重写为D>=SYSDATE@+1和数据这两个查询不是同义词。中间包含两个参数。我建议读这两篇文章,和虽然是为SQL Server编写的,但许多参数对Oracle仍然有效;第一个是>而不是>=,这可能是问题中的错误。不过,您想要查找哪些数据还不完全清楚。我还建议你不要使用带引号的标识符或隐式日期转换,但两者都超出了问题的范围。谢谢你的链接,我已经找了好一阵子这个主题,但我的谷歌搜索引擎在这件事上没有发现任何东西。这两个查询不是同义词。中间包含两个参数。我建议读这两篇文章,和虽然是为SQL Server编写的,但许多参数对Oracle仍然有效;第一个是>而不是>=,这可能是问题中的错误。不过,您想要查找哪些数据还不完全清楚。我还建议你不要使用带引号的标识符或隐式日期转换,但这两种转换都超出了问题的范围。感谢链接,我已经找了很长一段时间了,但我的谷歌搜索引擎在这件事上没有发现任何东西。日期是抽象的,但由于原始列名在此上下文中毫无意义,我冒昧地将其更改为可读性更强的内容,尽管不太正确。日期是抽象的,但由于原始列名在此上下文中毫无意义,我冒昧地将其更改为可读性更强的内容,尽管不太正确。