2016-12-22 128 views
1

这是我的表,名称是resource_calendar。选择查询以选择最近的日期,该日期小于或等于postgresql中的当前日期

enter image description here

我想选择RESOURCE_ID具有生效日期小于或等于当前的日期和最最接近的日期为当前日期。

什么是postgresql中的正确查询?

查询将

select effective date 22 for resource_id=3 and effective date 21 for resource_id=7 

所以结果应该是

id  resource_id calendar_id applied_on    effective_date version 
    19  3   6   2016-12-22 11:13:26.53 2016-12-22  0 
    26  7   5   2016-12-22 11:16:26.53 2016-12-21  0  
+0

小于??是不是小于或等于当前日期? – 1000111

+0

ya它小于或等于 –

回答

2
SELECT t.* 
FROM 
(
    SELECT id, resource_id, calendar_id, applied_on, effective_date, version, 
      MIN(ABS(EXTRACT(EPOCH FROM (current_timestamp - effective_date)))) 
       OVER (PARTITION BY resource_id) AS diff 
    FROM resource_calendar 
    WHERE EXTRACT(EPOCH FROM (current_timestamp - effective_date)) > 0 
) t 
WHERE ABS(EXTRACT(EPOCH FROM (current_timestamp - t.effective_date))) = t.diff 

此查询resource_idresource_calendar形成一个分区。你可以把这个分区看作一个逻辑分组记录在一起,它们具有相同的resource_id。对于每个这样的记录组,其计算effective_date与当前时间戳之间的最小差值,其中effective_date早于当前时间戳。

外部查询然后标识具有该最小时间戳差异的那些记录。

如果你觉得你需要更多的信息,Postgres有一些使用窗口函数的reasonably helpful documentation

+0

感谢它正在工作 –

+0

为什么要经历'timestamp'数学的所有麻烦,如果你有'日期'列并需要比较日期?这是一个非常浪费的解决方案,并且[Durgpal Singh的解决方案](http://stackoverflow.com/a/41278038/3304426)远远优越。 – Patrick

+0

@Patrick很好,当我回答某些原因时,我认为'effective_date' _was_是一个时间戳,可能从那时起编辑这个问题。 –

2

您可以使用它。一个简单的查询

SELECT DISTINCT ON(resource_id) * 
FROM planner.resource_calendar 
WHERE effective_date <= CURRENT_DATE 
ORDER BY resource_id, effective_date desc; 
+1

雅这是非常简单的查询,并给出相同的结果 –

+3

非常优雅的解决方案,但我会''CURRENT_DATE'而不是'now()',看到我们在这里处理日期。 – Patrick

+0

是的,你是对的@帕特里克 –

相关问题