【问题标题】:How to check if specified date contains in records or not如何检查指定日期是否包含在记录中
【发布时间】:2014-01-09 15:30:45
【问题描述】:

我想要一些奇怪的东西。我的表名称为EMP_INFO,其中包含员工的一些详细信息(即姓名、职务、JOIN_FROM、JOIN_TO)。我试图每年计算每个员工的任期。我有以下类型的数据

EMP_ID   EMP_DESIG     JOIN_FROM    JOIN_TO                Query Result
  1      Supervisor    01-05-11     30-04-13               Should Display
  2      Supervisor    15-06-10     31-12-12               Should Display
  3      Jobar         01-01-12     31-12-13               Should Display
  4      SR Superior   01-12-11     31-12-15               Should Display
  5      Supervisor    01-05-11     31-12-13               Should Display
  6      Supervisor    01-05-11     31-12-13               Should Display
  7      Supervisor    01-05-11     31-12-13               Should Display
  8      Supervisor    01-02-12     15-06-13               Should Display
  9      SR Superior   16-03-10     18-11-11               Should Display
  10     SR Superior   16-06-05     18-11-11               Should Display
  11     Jobar         30-11-11     31-12-13               Should Display
  12     Superior      02-02-05     31-12-20               Should Display
  13     Jobar         30-11-11     31-12-13               Should Display
  14     Jobar         30-11-09     31-12-10               Should Not Display

基本上我需要的是我的报告中有日期范围,让我们说从:“01-Jun-11”到“31-Dec-13”。从上面的记录集报告应该检索所有记录,因为所有记录都包含这两个日期。

我尝试过使用 BETWEEN 语法,但我相信它不会起作用。

如果有人可以帮助我,将不胜感激。

在此先感谢.. 如果这些细节还不足以理解,请告诉我,我会添加更多细节。

修改 我试过的查询

SELECT EI.*     
FROM EMP_INFO EI,     
     (SELECT 
     TO_DATE('01-JUN-2011','DD-MON-YYYY') A,
     TO_DATE('31-DEC-2013','DD-MON-YYYY') B FROM DUAL) X   
WHERE   
(EI.JOIN_FROM IS NOT NULL AND EI.JOIN_TO IS NOT NULL)    
AND   (
           X.A BETWEEN EI.JOIN_FROM AND EI.JOIN_TO   
       AND X.B BETWEEN EI.JOIN_FROM AND EI.JOIN_TO   
       OR (EI.JOIN_FROM >= X.B   AND EI.JOIN_TO <=X.A)    )

修改在上表中添加了列(查询结果),其中包含每条记录的结果。

【问题讨论】:

  • 您可以包含您尝试过的查询吗?
  • @AbhinavRanjan: 看看我试过的添加查询
  • 表格日期列是日期类型还是varchar?
  • @AbhinavRanjan:两个日期列都属于 DATE 数据类型。
  • 目前我正在使用我的手机,所以不能做太多事情。我建议使用 date_format 将您的日期转换为相同的格式,然后进行比较。

标签: database oracle stored-procedures oracle11g


【解决方案1】:

所以您只是想要加入时间在给定时间范围内的所有记录?那将是:

SELECT *     
FROM EMP_INFO
WHERE JOIN_FROM BETWEEN 
  TO_DATE('01-JUN-2011','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN') AND 
  TO_DATE('31-DEC-2013','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')
AND JOIN_TO BETWEEN 
  TO_DATE('01-JUN-2011','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN') AND 
  TO_DATE('31-DEC-2013','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN');

编辑:对不起,我现在明白了。您正在寻找与给定范围重叠的所有时间范围。那将是:开始于之前和结束于其中的范围、开始于之前和结束于之后的范围、开始于内部并结束于之内以及开始于之内和结束于之后的范围。另一种表达方式是:给定时间范围开始在另一个时间范围内,或者另一个时间范围开始在给定时间范围内。以下是相应的声明:

SELECT *     
FROM EMP_INFO
WHERE JOIN_FROM BETWEEN 
  TO_DATE('01-JUN-2011','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN') AND 
  TO_DATE('31-DEC-2013','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')
OR TO_DATE('01-JUN-2011','DD-MON-YYYY', 'NLS_DATE_LANGUAGE=AMERICAN')
  BETWEEN JOIN_FROM AND JOIN_TO;

这里是 SQL 小提琴:http://sqlfiddle.com/#!4/b58b3/3

【讨论】:

  • 感谢您的回复。但是这个查询也不起作用。如果您看到第一条记录,则有“01-May-11”,但此后我们将拥有所有日期(即从“01-Jun-11”到“30-04-13”。这是提供日期的有效日期range) 将属于我们的日期范围 rit ???以便该记录应显示在搜索结果中。理想情况下,所有记录都应显示包含所提供日期的一部分。
  • 啊,我明白了。您不仅想要整个范围在给定日期之间的记录,还想要它们的部分范围在其中的记录。所以只需将 AND JOIN_TO 替换为 OR JOIN_TO。就是这样。
  • 如果我有像“JOIN_FROM”=“01-01-02”和JOIN_TO=“20-01-20”这样的日期,让我们假设一个记录。如果您查看此日期,则此日期包含年份(即 2011、2012、2013 年)正确???。所以它应该显示,因为它是这个范围的一部分,但在这种情况下它不会显示
  • 不,我还是不明白。要么您只希望包含完整的范围,然后您将上述查询与 AND 结合使用。或者您还想要部分覆盖范围,然后使用 OR 查询。你用 OR 试过了吗?
  • 是的,我尝试使用 OR,但在其中一种情况下失败了。因此,我使用了您的查询并添加了一些内容,我认为它会起作用。是的,我需要范围内和部分覆盖范围内的所有记录。像这样:如果 JOIN_FROM 包含“01-Jun-12”,那么它应该显示在结果中,并且与 JOIN_TO 相同
【解决方案2】:

转换为相同的格式并进行比较。存储在数据库中的日期中可能存在时间分量。之前的答案是错误的。

【讨论】:

  • 但正如我在问题中提到的,我需要那些包含指定日期范围的记录。让我们以第 11 条记录为例。它的值 JOIN_FROM = 30-11-11 和 JOIN_TO = 31-12-13。由于整个期间(2011 年到 2013 年)都在选定范围内,它应该显示在结果中,但我写的查询没有给我正确的结果。
  • 那么你应该比较 x.a 和 x.b 之间的 join_to。
  • 这就是你想要的吗?
  • 没有花花公子和thanx的帮助...我不知道我是否向您提供了可以理解的信息。但它仍然行不通。查看上面我提供给“Thorsten Kettner”的答案
  • 对于第 11 种情况,x.a 是 01-05-11,因此 x.a 不在 30-11-11 和 30-12-13 之间,因此您不会在结果中得到它。
猜你喜欢
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多