如何检查指定的日期是否包含在记录中

时间:2013-12-20 17:47:55

标签: database oracle stored-procedures oracle11g

我想要一些奇怪的东西。我的表名为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)    )

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

转换为相同格式并进行比较。日期中可能存在时间组件存储在数据库中。以前的回答是错的。