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

标签 sql select join firebird firebird-3.0

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

我有一个包含此字段的表

  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    |

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

最佳答案

您可以使用可选择的存储过程来解决此问题。

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

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)

并且将返回(在本例中)31 行,其中包含 2018 年 1 月的所有日期。

您的问题文本中的表定义只是伪代码,因此我无法使用它来提供工作示例。但是对于真实的数据表,您可以使用(左)连接语法(上面的 days_in_month 过程在左侧,物理表在另一侧)并使用 Firebirds 内置函数 extract 和 case,或者您可以将其全部放入存储过程中,这可能允许以更命令式的方式进行编程。

关于sql - 在 firebird select 过程中显示给定月份和年份的所有日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48928585/

相关文章:

php - PDO 联合选择结果没有任何结果

sql - 使用直线时避免在列名中打印表名

php - 对表 1 的请求中表 2 中的用户进行计数

join - Entity Framework 加入

python - SQLAlchemy - 不要对关系强制执行外键约束

PHP/MySQL 连接 - 嵌套 While?

php - SQLite 文件大小在删除表后仍然没有改变

sql - 计算每个客户订单之间的平均时间

sql - Sql中如何使用IF/ELSE语句更新或新建xml节点条目

c# - SQLite 查询中的 "Apply joins is not supported"