我想要一些奇怪的东西。我的表名为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) )
已修改在上表中添加了列(查询结果),其中包含每条记录的结果。
答案 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)
转换为相同格式并进行比较。日期中可能存在时间组件存储在数据库中。以前的回答是错的。