首页 > 解决方案 > SQL空日期比较

问题描述

我在员工数据库上提供了两个查询(我们检查它们是否相等),我需要显示我们是否需要使用 IS NULL 值来确定我们的表是否会给出正确的结果。我们有工资表的三个属性,即to_datefrom_dateemp_no,如果工资行仍然有效,则 to_date 将具有 NULL(即,emp_no 的工资仍然是最新的因此to_dateNULL)。这些是正在比较的查询:

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) ;

目标是找出在 12 月份领到薪水的员工人数,领取薪水的唯一条件是该员工在 12 月份至少有一天的薪水。

标签: sqlpostgresqldatenull

解决方案


您正在寻找在 1996 年 12 月至少工作了一天的员工。

这看起来是使用日期功能的好地方overlaps()

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

实际上,当员工的最后一天工作是 12 月 1 日时,上述表达式具有优势(在这种情况下,我认为您想将其计算在内,而这不会)。因此,我们可以只写:

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

推荐阅读