我有这个例子
FROM TILL
2016-02-27 2016-12-31
2017-01-01 <null>
我需要2013年至2017年之间的日期,但是当TILL-Date为null时,此查询将不起作用。我只是获得第一行,而不是第二行。在> COALESCE('2017',null)中尝试过,但这确实有效。
where not (FROM > '2017-12-31' or TILL < '2013-01-01' )
编辑蒂姆
FROM TILL
2017-06-16 2018-05-31
2018-06-01 <null>
答案 0 :(得分:1)
您可以尝试以下逻辑:
SELECT a.aid,(SELECT CONCAT
(CASE
WHEN (SELECT COUNT(1) FROM attdpunches ap WHERE
ap.punchtime BETWEEN CONCAT_WS('','2018-07-01', ' 00:00:00') AND CONCAT_WS('','2018-07-01', ' 23:59:59')
AND aid=ap.attid)=1 THEN CONCAT('Status:E|InTime:E|OutTime:NA')
ELSE 'Status:A|InTime:NA|OutTime:NA' END
)
) AS 2018July02
FROM attendees a JOIN organisations o ON a.orgid=o.orgid WHERE a.status=1 AND a.aid=41617
这将包括SELECT *
FROM yourTable
WHERE
"FROM" <= '2013-01-01' AND
(TILL > '2018-12-31' OR TILL IS NULL);
至FROM
范围跨越2013-2018年(包括该年)的所有记录。我假设您仅存储日期,而不存储时间戳。否则,您需要将TILL
与TILL
进行比较。
请避免使用诸如2018-12-31 23:59:59
之类的保留关键字来命名列和其他数据库对象。否则,您将必须在所有代码中转义这些名称。
答案 1 :(得分:0)
尝试如下所示,在条件中添加对直到直到的空检查
where (FROM>='2013-01-01' and till<='2018-12-31')
or (FROM>='2013-01-01' and till is null)
使用coalesce()
where FROM>='2013-01-01' and coalesce(till,'2018-12-31')<='2018-12-31')
答案 2 :(得分:0)
使用Postgres时,您有更好的处理方式-您可以创建一个日期范围,该范围可以轻松处理上限的NULL值:
select *
from the_table
where daterange(from_date, till_date, '[]') && daterange(date '2013-01-01', date '2018-01-01', '[)')
&&
是“重叠”运算符-您不能真正使用“包含”运算符(@>
),因为您的行带有{{1}的null
值}的意思是“从2017年1月1日到永恒”,并且从2013年到2017年这样的封闭范围不会“包含”一直到“永恒”的范围