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

Mag*_*use 0 sql oracle date

我有 2 个 SQL 脚本。像这样的一个:

"Date" > '2014-04-11' AND "Date" <= '2014-04-12'
Run Code Online (Sandbox Code Playgroud)

另一个是这样的:

"Date" BETWEEN '2014-04-11' AND '2014-04-12'
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否有任何具体的最佳实践,一个比另一个更好的理由,以及其中一个是否因为某些明显的原因而更好,我在路上的某个地方错过了。

Gor*_*off 5

您正在寻求最佳实践。我认为以下是最佳实践:

"Date" >= DATE '2014-04-11' AND "Date" < DATE '2014-04-12' + 1
Run Code Online (Sandbox Code Playgroud)

首先,注意关键字的使用DATE。您的问题是关于日期的,但您使用的是 Oracle 不直接支持的日期格式。令人高兴的是,Oracle 支持 ANSI 标准DATE关键字和 ISO 标准格式。

其次,我添加了一个,+1以便您可以看到时间段的结束时间,这可能是您希望在代码中看到的内容。它不应该影响性能,因为它+ 1是一个常数。

第三,日期常量具有时间成分。如果未指定,则为该日期的午夜。所以,表达式:

"Date" BETWEEN '2014-04-11' AND '2014-04-12'
Run Code Online (Sandbox Code Playgroud)

是真的:

"Date" >= TIMESTAMP '2014-04-11 00:00:00' AND "Date" <= TIMESTAMP '2014-04-12 00:00:00'
Run Code Online (Sandbox Code Playgroud)

也就是说,恰好包含较晚日期之后的一个时间,即午夜的第一个时刻。这通常不是您想要的。Oracle 在两个方面使这个问题变得更糟:

  1. 数据date类型包括时间分量。
  2. 呈现值的默认方式date没有时间部分。

因此,为了最安全,请使用以下规则:

  • 请勿between在日期上使用。
  • 用于>=第一次约会。
  • <第二个用户。

Aaron Bertrand 有一个关于这个主题的博客。尽管它是专门针对 SQL Server 的,但许多想法也适用于 Oracle — 特别是因为dateOracle 中的数据类型包含时间。