【问题标题】:Oracle Select Where Date Between TodayOracle 选择今天之间的日期
【发布时间】:2014-09-24 21:45:44
【问题描述】:

我有一个这样的 Oracle SELECT 查询:

Select * From Customer_Rooms CuRo
   Where CuRo.Date_Enter Between 'TODAY 12:00:00 PM' And 'TODAY 11:59:59 PM'


我的意思是,我想选择今天“date_enter”字段所在的所有位置。我已经在两者之间尝试过Trunc(Sysdate) || ' 12:00:00'之类的东西,但没有用。

建议:我不能使用 TO_CHAR,因为它太慢了。

【问题讨论】:

  • 你只在下午选择东西,你知道的。 12点是中午。通常要比较没有时间的日期,您只需将它们都截断(而且您真的需要表中的时间吗?首先将其截断可能会使事情变得更快更容易。)

标签: sql oracle select


【解决方案1】:

假设date_enterDATE 字段:

Select * From Customer_Rooms CuRo
   Where CuRo.Date_Enter >= trunc(sysdate)
   And CuRo.Date_Enter < trunc(sysdate) + 1;

trunc() 函数默认去掉时间部分,所以trunc(sysdate) 给你今天早上的午夜。

如果你特别想坚持使用between,并且你有一个DATE 而不是TIMESTAMP,你可以这样做:

Select * From Customer_Rooms CuRo
   Where CuRo.Date_Enter between trunc(sysdate)
      And trunc(sysdate) + interval '1' day - interval '1' second;

between 是包容性的,所以如果你不休息一秒钟,那么你可能会从今晚午夜开始收集记录;所以这会生成您在原始查询中寻找的 23:59:59 时间。但无论如何,在我看来,使用&gt;=&lt; 会更清晰、更明确。

如果您确定无论如何不能有迟于今天的日期,则上限实际上并没有添加任何内容,您将得到相同的结果:

Select * From Customer_Rooms CuRo
   Where CuRo.Date_Enter >= trunc(sysdate);

您不想在date_enter 列上使用truncto_char;使用任何函数都会阻止使用该列上的索引,这就是您使用 to_char 的查询太慢的原因。

【讨论】:

  • 这就是我要做的。好吧,无论如何,第一点。我不喜欢在 23:59:59 之前执行操作的代码 - 某些数据库的时间类型的分辨率可能会错过某些事情(例如 23:59:59.43)这会比 GR Envoy 的答案中截断两个日期更快吗?还是 Oracle 足够聪明,可以使用索引?
  • 如果对列应用函数,Oracle 不会使用索引;所以trunc(CuRo.Date_Enter) 不会使用索引,不。我认为优化器不够聪明,无法为trunc 提供特殊情况。
  • 是的,这是我的怀疑。 +1。
  • 那个答案似乎消失了。但是,oracle 不会对函数结果使用索引。在这个答案中使用第一个代码 sn-p。
  • @Alex,它确实有效。谢谢!!我使用了“Select * From Customer_Rooms CuRo Where CuRo.Date_Enter >= trunc(sysdate) And CuRo.Date_Enter
【解决方案2】:

就我而言,我正在搜索一些日志文件,只想找到今天发生的那些。

对我来说,发生在什么时候并不重要,只要是今天,所以:

/*...*/
where
    trunc(_DATETIMEFROMSISTEM_) = trunc(sysdate)

它非常适合这种情况。

【讨论】:

  • 如果您在 trunc(_DATETIMEFROMSISTEM_) 上有一个索引,但 _DATETIMEFROMSISTEM_ 上的索引不会用于此目的。
  • 讨厌列名顺便说一句:)
【解决方案3】:

是的,你可以这样写查询

select * from table_name where last_time<=CURRENT_TIME() and last_date<=CURRENT_DATE() 

【讨论】:

  • 不是真的:ORA-00904: "CURRENT_TIME": invalid identifier
【解决方案4】:

试试下面的代码

Select * From Customer_Rooms CuRo
   Where trunc(CuRo.Date_Enter) = 'TODAY' -- TODAY is the date of today without any timestamp.

【讨论】:

  • sysdate 有当前时间,所以trunc(CuRo.Date_Enter) = sysdate 只会在您恰好在午夜运行它时才能找到记录。不确定TODAY 是什么;如果是像 01/08/2014 这样的日期,那么您会依赖隐式转换吗?并且截断列值会停止正在使用的任何索引。
  • 您已经删除了其他人也弄错了的 sysdate 部分,但是该列上的 trunc 仍然可能是一个性能问题,并且不清楚 TODAY 究竟是什么.
  • @AlexPoole 我删除了 sysdate 代码以及关于基于 TODAY 查询函数的索引将正常工作。
  • 没错,您可以为trunc(date_enter) 添加一个 FBI,但您可以在答案中提及这一点吗?那么'TODAY' 代表trunc(sysdate) 吗?
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 2015-10-28
相关资源
最近更新 更多