Mysql 显示从开始日期到结束日期的每周计划器事件

Mysql 显示从开始日期到结束日期的每周计划器事件,mysql,sql,database,mariadb,Mysql,Sql,Database,Mariadb,在过去的两天里,我一直在为这件事挠头——我需要一双专业的眼睛 基本上,我尝试在一周内为驾驶员显示planner事件,直到他们关闭。如果驾驶员从2018年12月10日到2018年12月21日休假,则我希望驾驶员滚动到第二天,并在结束日期前显示其姓名。现在,结果只显示当天的驱动程序,而不是每天重复出现 以下是一个示例数据集: CREATE TABLE IF NOT EXISTS planner_events ( planner_id INT(5) UNSIGNED AUTO_INCREMENT

在过去的两天里,我一直在为这件事挠头——我需要一双专业的眼睛

基本上,我尝试在一周内为驾驶员显示planner事件,直到他们关闭。如果驾驶员从2018年12月10日到2018年12月21日休假,则我希望驾驶员滚动到第二天,并在结束日期前显示其姓名。现在,结果只显示当天的驱动程序,而不是每天重复出现

以下是一个示例数据集:

CREATE TABLE IF NOT EXISTS planner_events (
  planner_id INT(5) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  event_name VARCHAR(100) NOT NULL,     
  event_start_date DATE,    
  event_end_date DATE,
  user_id INT(5) NOT NULL,  
  user_type VARCHAR(10) NOT NULL,
  date_created DATETIME DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO planner_events (event_name, event_start_date, event_end_date, user_id, user_type)
VALUES ('Annual Holiday', '2018-12-12', '2018-12-16', 101, 'driver'), 
('Alex on leave', '2018-12-12', '2018-12-15', 102, 'driver'), 
('Reminder', '2018-12-13', '2018-12-13', 103, 'driver');

CREATE TABLE IF NOT EXISTS drivers (
  driver_id INT(5) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  driver_name VARCHAR(100) NOT NULL, 
  date_created DATETIME DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO drivers (driver_id, driver_name)
VALUES (101, 'Alex'), (102, 'Tom'),(103, 'Trevor');
我已经创建了一个SQL Fiddle,但是默认情况下SQL Fiddle没有存储seq_0_to_9999表。我使用的是MariaDB的最新版本

如果安装了MariaDB,您可以在本地计算机上复制上面的表和SQL语句

基本上,在代码中,使用in_数组函数,如果驱动程序在给定的一天关闭,我将从可用性框中删除它们。我试图通过1个查询来实现这一点,它检索一周中的空天数或司机休假的天数。目前,只有在给定日期有条目时,查询才起作用,问题是,如果结束日期尚未结束,查询不会继续

下面是一个执行当前查询的好例子。如果你看下面的屏幕,马里奥将在2019年1月1日之前离开,但是第19、20、21、22和23天是空白的,没有说出他的名字。他们可能需要在某个地方交叉连接——逻辑思维


如果您有任何帮助,我们将不胜感激,并感谢您抽出时间

在我看来,这就是您所需要的全部查询:

SELECT d.driver_id
     , d.driver_name
     , e.planner_id
     , e.event_name
     , e.event_start_date
     , e.event_end_date
  FROM drivers d 
  JOIN planner_events e 
    ON e.user_id = d.driver_id;

其他一切似乎都是一个显示问题—最好在应用程序代码中解决。

我发现您的小提琴中的查询有点难以理解。但我想你想要的是:

select *
from planner_events e
join drivers d on d.driver_id=e.user_id
where e.event_start <= @enddate and e.event_end >= @startdate
  and e.user_type='driver'

有一位先生叫安德烈,他过去帮助过我,他回答了我的期望。也要感谢@Jay发布了这个问题的另一个答案

以下是正确的SQL查询:

SELECT sub.planner_start_date, COALESCE(d.driver_name, 'N/A') AS driver_name, e.planner_id, e.event_name, e.event_start_date, e.event_start_time, e.event_end_date, e.event_end_time
FROM
( SELECT
        '2018-12-30' + INTERVAL seq.seq DAY AS planner_start_date
     FROM
        seq_0_to_999999 AS seq
     WHERE
        seq.seq <= TIMESTAMPDIFF(DAY, '2018-12-30', '2019-01-05')
    ) as sub
LEFT JOIN planner_events AS e ON e.event_start_date <= sub.planner_start_date AND e.event_end_date >= sub.planner_start_date
LEFT JOIN drivers AS d ON e.user_id = d.driver_id AND e.user_type = 'driver'

谢谢大家在这方面的帮助。

我担心您将数据存储和检索问题与数据显示问题混为一谈。如果您仍在努力,给定参数集的预期结果可能会有用。我刚刚上传了我正在处理的当前系统的视图,并解释了我的意思。我的目标是编辑它来描述结果;数据集和结果集彼此之间没有任何关系。这只适用于每日视图,而不是每周视图。我已经有这个查询每天工作。我面临的问题是,我们需要一种方法,每天向司机展示一周中的开关情况。不,这在每周视图中有效。给出一周的开始和结束日期。任何与本周重叠的事件都将包含在输出中。试试看,或者举个例子。假设这一周是12月9日至15日。如果事件发生在12月8日至12日,它将通过测试。如果是12月14日至20日,它将通过测试。12月8日至16日将通过测试。但12月7日至8日不会,12月20日至21日也不会。我刚刚更新了帖子,上传了一张图片——你会明白我的意思。我刚刚添加了结果集;输出和丢失的内容。这不起作用,因为有理由使用CASE语句、user_id和user_类型。seq位在我看来有点愚蠢。显然,您正在应用程序代码中输出结果,因此这似乎是处理显示方面的合理位置。不过,这是你的派对。
select d.driver_id, d.driver_name,
  case when exists (select * from planner_events where '2018-12-31' between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Monday,
  case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 1 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Tuesday,
  case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 2 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Wednesday,
  case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 3 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Thursday,
  case when exists (select * from planner_events where DATE_ADD('2018-12-31', INTERVAL 4 DAY) between event_start_date and event_end_date and user_id=d.driver_id) then 'N' else 'Y' end as Friday
from drivers d
order by d.driver_id
SELECT sub.planner_start_date, COALESCE(d.driver_name, 'N/A') AS driver_name, e.planner_id, e.event_name, e.event_start_date, e.event_start_time, e.event_end_date, e.event_end_time
FROM
( SELECT
        '2018-12-30' + INTERVAL seq.seq DAY AS planner_start_date
     FROM
        seq_0_to_999999 AS seq
     WHERE
        seq.seq <= TIMESTAMPDIFF(DAY, '2018-12-30', '2019-01-05')
    ) as sub
LEFT JOIN planner_events AS e ON e.event_start_date <= sub.planner_start_date AND e.event_end_date >= sub.planner_start_date
LEFT JOIN drivers AS d ON e.user_id = d.driver_id AND e.user_type = 'driver'