SQL сравнение нулевой даты - PullRequest
0 голосов
/ 24 марта 2020

У меня есть два запроса к базе данных сотрудников (которые мы проверяем, эквивалентны они или нет), и мне нужно показать, нужно ли нам использовать значение IS NULL для определения, даст ли наша таблица правильный результат или нет. У нас есть три атрибута таблицы salary : to_date и from_date и emp_no , где по соглашению to_date будет иметь значение NULL, если строка salary все еще действительна (т.е. зарплата все еще актуальна для emp_no , поэтому to_date имеет значение NULL). Это сравниваемые запросы:

SELECT COUNT(*)
FROM salaries
WHERE from_date <= '1996-12-31' AND to_date >= '1996-12-01';

и

SELECT COUNT(*)
FROM   salaries
WHERE  from_date <= '1996-12-31' AND (to_date >= '1996-12-01' OR to_date IS NULL) ;

Цель состоит в том, чтобы определить количество работников, получивших заработную плату в декабре, и единственное условие получения зарплаты - это занятость, имеющая заработную плату. в течение как минимум одного дня в декабре.

1 Ответ

0 голосов
/ 24 марта 2020

Вы ищете сотрудников, которые работали хотя бы один день в декабре 1996 года.

Это выглядит как хорошее место для использования функции даты overlaps():

where (from_date, coalesce(to_date, now())) 
    overlaps ('1996-12-01'::date, interval '1' month)

Фактически выше Выражение имеет преимущество, когда последний день работы сотрудника - 1 декабря (в этом случае я думаю, что вы хотите его учесть, а это не так). Поэтому вместо этого мы могли бы написать:

where
    from_date < '1997-01-01'::date
    and (to_date is null or to_date >= '1996-12-01'::date)
...