在 firebird select 过程中显示给定月份和年份中的所有日期

Display all Dates in a given month and year in firebird select procedure

我正在制作一个考勤程序。

我有一个 table 有这个字段

  ATTEND_PK INTEGER NOT NULL,
  EMP VARCHAR,
  ATTEND_DATETIME TIMESTAMP,
  USER_PK SMALLINT,
  ATTEND_UPDATETIME TIMESTAMP);

这里是示例数据

| ATTEND_PK  |     EMP       |      ATTEND_DATETIME       |
|     1      |    john       |     1/23/2018 7:00:00      |
|     2      |    john       |     1/23/2018 12:00:00     |
|     3      |    john       |     1/23/2018 13:00:00     |
|     4      |    john       |     1/23/2018 16:00:00     |
|     5      |    john       |     1/24/2018 7:30:00      |
|     6      |    john       |     1/24/2018 11:50:00     |
|     7      |    john       |     1/24/2018 13:20:00     |
|     8      |    john       |     1/24/2018 16:40:00     |

我想要的输出是这样的

 |   EMP    |    DATE     |    AM_IN   |   AM_OUT   |   AM_IN  |   AM_OUT   |
 |   john   |  1/1/2018   |     NULL   |    NULL    |   NULL   |    NULL    | 
 |   john   |  1/2/2018   |     NULL   |    NULL    |   NULL   |    NULL    |
 |   ....   |   .....     |     NULL   |    NULL    |   NULL   |    NULL    |
 |   john   |  1/23/2018  |   7:00:00  |  12:00:00  |  1:00:00 |   4:00:00  |
 |   john   |  1/23/2018  |   7:30:00  |  11:50:00  |  1:20:00 |   4:40:00  |
 |   ....   |   .....     |     NULL   |    NULL    |   NULL   |    NULL    |
 |   john   |  1/31/2018  |     NULL   |    NULL    |   NULL   |    NULL    |

我想要的输出和我的数据的时间格式不同,显示给定月份和年份的完整日期

您可以使用 selectable 存储过程解决这个问题。

首先,这是一个列出一个月中的天数的过程:

create procedure days_in_month (y int, m int)
returns (d date) as
begin
  d = cast(y || '-' || m || '-01' as date);
  while (extract(month from d) = m) do
  begin
    suspend;
    d = d + 1;
  end
end

可以这样调用

select * from days_in_month (2018, 1)

并将return(在本例中)包含 2018 年 1 月所有日期的 31 行。

您问题文本中的 table 定义仅为 pseudo-code,因此我无法使用它来提供工作示例。但是对于真实数据 table,您可以使用(左)连接语法(在左侧使用上述 days_in_month 过程,在另一侧使用物理 table )并利用Firebirds built-in 函数提取和大小写,或者您可以将它们全部放在存储过程中,这可能允许以更命令的方式进行编程。