Sql 查找两个日期之间的日期(最佳实践)
我有两个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 &
"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仍然有效;第一个是>而不是>=,这可能是问题中的错误。不过,您想要查找哪些数据还不完全清楚。我还建议你不要使用带引号的标识符或隐式日期转换,但这两种转换都超出了问题的范围。感谢链接,我已经找了很长一段时间了,但我的谷歌搜索引擎在这件事上没有发现任何东西。日期是抽象的,但由于原始列名在此上下文中毫无意义,我冒昧地将其更改为可读性更强的内容,尽管不太正确。日期是抽象的,但由于原始列名在此上下文中毫无意义,我冒昧地将其更改为可读性更强的内容,尽管不太正确。