- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在过去的 2 天里,我一直在为这个问题挠头 - 我需要专家的眼光!
基本上,我试图在 1 周内为司机显示计划程序事件,直到他们下类。如果司机在 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_999999 表。我正在使用最新版本的 MariaDB。
如果您安装了 MariaDB,您可以将上面的表和 SQL 语句复制到您的本地计算机上。
基本上,在代码中,如果驱动程序在给定的一天关闭,我将使用 in_array 函数从可用性框中删除驱动程序。我试图通过 1 个查询来实现这一点,它检索一周的空天或司机关闭的地方。目前,查询仅在有给定日期的条目时才有效,问题是,如果结束日期尚未结束,则查询不会继续。
这是执行当前查询的一个很好的例子。如果您查看下面的屏幕,马里奥将在 2019 年 1 月 1 日之前休息,但第 19、20、21、22 和 23 天是空白的,并且没有说出他的名字。他们可能需要在某处进行 CROSS JOIN - 逻辑思考!
如有任何帮助,我们将不胜感激,感谢您抽出宝贵的时间!
最佳答案
我发现您的 fiddle 中的查询有点难以理解。但我认为你想要的是:
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'
@startdate 是您感兴趣的时间段的第一天,@enddate 是最后一天。如果范围的大小始终相同,一周或其他时间,@enddate 可以替换为计算。
这应该会为您提供事件与所需日期范围重叠的所有司机的列表。如果您想要的是所有在该日期范围内没有赛事的车手,那么只需反转日期测试即可。
哦,当然你应该列出你真正感兴趣的任何字段而不是“select *”。我只是在那里偷懒。
更新
啊,我明白了。您需要每天有空的人员列表,而不仅仅是一周中某个时间有空的人员。
好的,据我所知,要做到这一点,您需要一个包含每天记录的表格。有多种方法可以创建这样的表,我不知道使用标准 SQL 的方法。如果创建该表是我们可以解决的问题,但让我假设它不是,并且这样的表存在并且称为“工作日”并且每个记录都包含一个日期字段“date1”。
然后查询可以这样完成:
select w.date1, d.driver_id, d.driver_name
from workdays w
cross join drivers d
where w.date1 between @start and @end
and not exists (select * from planner_event
where event_start<=w.date1 and event_end>=w.date1 and user_id=d.driver_id and user_type='driver')
order by w.date1, d.driver_id
这会给出一个包含日期和可用驱动程序列表的结果集,然后您必须使用代码将其格式化为您想要的表格。如果您正在寻找结果集,每天有一列,每个司机一行,或者类似的东西,我相信我们可以做到这一点,必须多尝试一下。我认为这将是一个困惑的查询,每天都有一个子查询。
更新 2
啊。如果我们知道周期是一周,那么我们就不需要工作日表。我们可以这样做:
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
关于mysql - 从开始日期到结束日期每周显示计划程序事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53748383/
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!