日期范围,直到日期为空

时间:2019-09-26 09:48:04

标签: sql postgresql

我有这个例子

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>

3 个答案:

答案 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年(包括该年)的所有记录。我假设您仅存储日期,而不存储时间戳。否则,您需要将TILLTILL进行比较。

请避免使用诸如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年这样的封闭范围不会“包含”一直到“永恒”的范围

在线示例:https://rextester.com/KBMK53890