firebird 2.5选择日期最接近今天的记录

时间:2017-03-17 18:04:08

标签: sql firebird firebird2.5

我的查询结果/表包含列:id,date。喜欢:

id,日期
0001,2012.01.20
0001,2014.10.12
0001,null
0001,2017.05.21
0001,2017.08.15
0002,null
0002,2013.06.05
0002,2017.08.11
0003,null
0004,2011.12.25
0005,2017.12.10
0006,null
0006,2013.04.23



等等...
这是一个例子 - 在现实世界中,有成千上万的id和超过一百五十万的记录。如何找到最接近今天的未来日期(id' s1000,0002,0005)的记录,这些记录仅使用null(id 0003),过去的日期(id 0004)或null和过去的日期(id 0006)替换为某些文本。结果应如下所示:

id,日期
0001,2017.05.21
0002,2017.08.11
0003,'替换文字'
0004,'替换文字'
0005,2017.12.10
0006,'替换文字'


等等...
我希望这个例子能说明我需要的东西 谢谢你的任何线索。

1 个答案:

答案 0 :(得分:1)

表似乎没有主键。 不要使用字段名称作为类型名称,例如“DATE”。

无论如何,这里有一个如何做你想要的例子,没有声称它是最好的。

请注意,如果记录很多,此过程将会很慢,因此请确保放置正确的索引。

SET TERM ^ ;

create or alter procedure TEMP_TEST_PROC (
    IDATE date)
returns (
    OID varchar(4),
    DATE_BEFORE date,
    DATE_AFTER date,
    CLOSEST_DATE date,
    OTEXT varchar(32))
as
begin
  for select distinct id from test_table_wo_pk
  into :oid
  do
  begin
    date_before = null;
    date_after = null;
    /* get closest past date*/
    select first 1 t."DATE" from test_table_wo_pk t
    where ((t."DATE" <= :idate) and (t.id = :oid))
    order by t."DATE" desc
    into
      :date_before;

    /* get closest future date*/
    select first 1 t."DATE" from test_table_wo_pk t
    where (t."DATE" >= :idate) and (t.id = :oid)
    order by t."DATE"
    into
      :date_after;

    /* bonus - get closest future or past date */

    ... You may check date_before, date_after for NULL here, and set closest_date value here....

    if ((datediff(day,:date_before,:idate)) < (datediff(day,:idate,date_after))) then
      closest_date = :date_before;
    else
      closest_date = :date_after;

    /* set text column */
    if (:date_after is not null) then
      otext = :date_after;
    else
      otext = 'replased text';
    suspend;
  end
end^

SET TERM ; ^

结果:

enter image description here