1), которые имеют вне времени больше, чем за 24 часов на основе в времени для «mmyyyy» = «112015»
Вы можете использовать TO_CHAR сравнить MMYYYY
, а затем вычесть out_time
и in_time
, чтобы проверить, превышает ли разность 24 hours
т.е. 1 день.
2) у кого нет времени на определенный месяц «mmyyyy» = '112015'.
Это должно быть простое условие IS NULL
.
Предполагая, что тип данных вашей in_time
и out_time
колонки быть ДАТА, ваш фильтр предиката будет:
WHERE TO_CHAR(in_time, 'MMYYYY') = TO_CHAR(out_time, 'MMYYYY')
AND out_time > in_time + 1
OR out_time IS NULL;
Рабочая Демо:
SQL> WITH sample_data AS(
2 SELECT 1 ID, SYSDATE -1 in_time, SYSDATE + 2/24 out_time FROM dual UNION ALL
3 SELECT 1, SYSDATE -10, SYSDATE + 2/24 FROM dual UNION ALL
4 SELECT 2, SYSDATE -1/24, SYSDATE + 2/24 FROM dual UNION ALL
5 SELECT 2, SYSDATE -1/24, NULL FROM dual
6 )
7 -- end of sample_Data mimicking a real table
8 SELECT *
9 FROM sample_data
10 WHERE TO_CHAR(in_time, 'MMYYYY') = TO_CHAR(out_time, 'MMYYYY')
11 AND out_time > in_time + 1
12 OR out_time IS NULL;
ID IN_TIME OUT_TIME
---------- -------------------- --------------------
1 15-DEC-2015 10:49:27 16-DEC-2015 12:49:27
1 06-DEC-2015 10:49:27 16-DEC-2015 12:49:27
2 16-DEC-2015 09:49:27
Если вы хотите ограничить это в конкретный месяц и год, просто добавьте еще одно условие:
AND TO_CHAR(in_time, 'MMYYYY') = '112015'
Как Страж указывает, используя TO_CHAR на колонке будет подавлять любой обычный индекс на in_time
колонке, не эффективно с точки зрения производительности. Лучшим способом было бы использовать диапазон.
Например,
SQL> WITH sample_data AS(
2 SELECT 1 ID, SYSDATE -1 in_time, SYSDATE + 2/24 out_time FROM dual UNION ALL
3 SELECT 1, SYSDATE -10, SYSDATE + 2/24 FROM dual UNION ALL
4 SELECT 2, SYSDATE -1/24, SYSDATE + 2/24 FROM dual UNION ALL
5 SELECT 2, SYSDATE -1/24, NULL FROM dual
6 )
7 -- end of sample_Data mimicking a real table
8 SELECT *
9 FROM sample_data
10 WHERE in_time >= to_date('112015','mmyyyy')
11 AND in_time < add_months(to_date('112015','mmyyyy'), 1)
12 AND (out_time > in_time + 1
13 OR out_time IS NULL);
ID IN_TIME OUT_TIME
---------- -------------------- --------------------
1 15-DEC-2015 11:38:20 16-DEC-2015 13:38:20
1 06-DEC-2015 11:38:20 16-DEC-2015 13:38:20
2 16-DEC-2015 10:38:20
Чтобы дать вам некоторую обратную связь, что формат '' in_time' и out_time' столбцов? Вы можете просто принять разницу между этими столбцами, как только вы перейдете к проблеме форматирования. –
@TimBiegeleisen Время и время выхода в формате даты. –
... и что вы пробовали? – Trent