在 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 函数提取和大小写,或者您可以将它们全部放在存储过程中,这可能允许以更命令的方式进行编程。
我正在制作一个考勤程序。
我有一个 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 函数提取和大小写,或者您可以将它们全部放在存储过程中,这可能允许以更命令的方式进行编程。