我通过PostgreSQL的generate_series(min, max)
以以下方式生成一个日期序列:
SELECT
generate_series(getstartdate(some arguments)
, getenddate(some arguments), interval '1 day')
FROM taskresults
CCD_ 2和CCD_ 3各自返回给定任务的开始日期和结束日期。我有更多的表Employees(employeeid, taskid, worktime)
和Tasks(taskid, startdate, enddate)
。
我的目标是从我生成的系列中,让员工每天的工作时间分组。如何执行此联接?注意,我不能直接访问表Tasks
中的列startdate
和enddate
,我只能通过上述函数访问日期。工作时间以小时/天为单位,因此我必须通过SUM()
为员工工作到该系列中给定日期的每项任务聚合工作时间。问题是我不知道如何访问生成的序列中的日期。
EDIT
数据结构:
CREATE TABLE employees
(
employeeid serial NOT NULL,
firstname character varying(32),
lastname character varying(32),
qualification character varying(32),
incomeperhour numeric,
)
CREATE TABLE employeetasks
(
projectid integer,
taskid integer,
employeeid integer,
hoursperday real,
)
CREATE TABLE taskresults
(
simulationid integer,
taskid integer,
duration integer
)
CREATE TABLE tasks
(
projectid integer NOT NULL,
taskname character varying(32),
startdate character varying(32),
enddate character varying(32),
predecessor integer,
minduration integer,
maxduration integer,
taskid integer,
)
一些解释:
整个数据库都是用于模拟的,因此首先您定义了一个任务时间表(在表tasks
中),然后运行将结果插入taskresults
的模拟。正如您所看到的,我只在结果中存储duration
,这就是为什么我只能使用getstartdate
/getenddate
函数访问每个任务的日期范围。表employeetasks
基本上为employees
表到task
表中的员工分配他们每天在该任务中工作的小时数。
您可以像其他任何操作一样对生成的系列执行JOIN
。
INNER JOIN generate_series(getstartdate(some arguments), getenddate(some arguments), interval '1 day') workday ON (...)
如果不知道数据是如何存储的,很难计算出联接条件。
此外,您的数据结构也很奇怪。员工有"taskid"?n: 1名员工->任务?我真的不能写一个完整的查询,因为我没有得到数据结构。