- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个组织内成员担任的历史职位任期表 (tbl_tenue)。每个职位一次只能由一个人担任,但一个人可以依次或同时担任多个职位。我想检查此表的完整性,方法是依次获取每个职位任期记录,然后将其与表中的所有其他记录进行比较,以查找(错误的)与同一职位的其他任期重叠。
我已经编写了一个工作查询(如下),在传递 test_tenure_id、position_id 以及特定任期的开始和结束日期时返回重叠的详细信息(见下文)对于每个重叠。此查询返回 tenure_id、member_id、member_sn、date_started、date_ended 和重叠的原因。
任何人都可以帮助我使用 sql 现在针对同一个 tbl_tenue 表运行此查询,每次将 tbl_tenue 中一行的数据传递给它,这样我就可以测试每条记录是否与其他记录重叠(当然除了它本身)并从记录及其所有重叠中返回数据?
(我意识到,如果我能做到这一点,那么我应该能够避免使用连接将 tenure_id 传递给 WHERE 子句,也可以避免使用连接传递日期,但我不能看看目前如何做到这一点,所以任何帮助都会很好)
下面的查询使用下表,针对这个问题进行了简化
TABLE tbl_member
( member_id INT AUTO_INCREMENT, -- pk
member_sn` varchar(50) , --surname
<other stuff>
)
TABLE tbl_tenure
(tenure_id INT AUTO_INCREMENT, -- pk
member_id INT -- fk to tbl_member
position_id -- fk to table of position titles
date_started DATE
date_ended DATE -- will be NULL if still in post
)
-- test data for query
SET @the_test_tenure_start_date = '2016-05-13' ;
SET @the_test_tenure_end_date = '2016-10-05';
SET @the_test_position_id = 18;
SET @the_test_tenue_id = 122;
-- the query to return overlaps with data from a given tenure record
SELECT
tbl_tenure.tenure_id,
tbl_tenure.member_id,
tbl_member.member_sn,
tbl_tenure.date_started,
tbl_tenure.date_ended,
CASE
WHEN @the_test_tenure_end_date <= IFNULL(date_ended, CURDATE()) -- test end date <= existing end date
AND @the_test_tenure_start_date >= date_started -- test start date >= existing start date
THEN 'Test dates fall completely inside an existing tenure'
WHEN @the_test_tenure_end_date >= IFNULL(date_ended, CURDATE()) -- test end date >= existing end date
AND @the_test_tenure_start_date <= date_started -- test start date <= existing start date
THEN 'An existing tenure falls completely inside test dates'
WHEN @the_test_tenure_start_date >= date_started -- test start date >= existing start date
AND @the_test_tenure_start_date <= IFNULL(date_ended, CURDATE()) -- test start date <= existing end date
THEN 'Test start date overlaps with an existing tenure'
WHEN @the_test_tenure_end_date >= date_started -- test end date >= existing start date
AND @the_test_tenure_end_date <= IFNULL(date_ended, CURDATE()) -- test end date <= existing end date
THEN 'Test end date overlaps with an existing tenure'
END AS reason
FROM
tbl_tenure
INNER JOIN tbl_member
ON tbl_tenure.member_id = tbl_member.member_id
WHERE ( -- there is an overlap (see qry 2.2 http://salman-w.blogspot.co.uk/2012/06/sql-query-overlapping-date-ranges.html
@the_test_tenure_end_date >= date_started)
AND
IFNULL(date_ended, CURDATE()) >= @the_test_tenure_start_date
)
AND tbl_tenure.position_id = @the_test_position_id -- position to be tested
AND tbl_tenure.tenure_id <> @the_test_tenue_id -- don't look at the test tenure record
ORDER BY tbl_tenure.date_started ASC;
为了澄清这个问题,我正在寻找的输出是这样的,注意 tenure_id 132 其中一个成员被记录为与自己重叠
tenure_id | member_id | position_id | start_date | end_date | overlapping_member_id | overlapping_tenure_id | overlapping_start_date |overlapping_end_date | overlap_reason
123 | 2 | 6 | 2016-02-01 | 2016 02-01 | 7 | 456 | 2016-01-05 | 2016-01-10 |'Test start date overlaps with an existing tenure'
125 | 2 | 8 | 2016-02-01 | 2016 03-01 | 8 | 459 | 2016-01-0 | 2016-02-01 |'Test end date overlaps with an existing tenure'
129 | 4 | 7 | 2016-03-10 | 2016 04-01 | 6 | 501 | 2016-03-2 | 2016-03-25 |'An existing tenure falls completely inside test dates'
132 | 4 | 7 | 2016-01-01 | 2016 04-01 | 4 | 505 | 2016-03-01 | 2016-04-01 |'Test end date overlaps with an existing tenure'
135 | 9 | 3 | 2016-05-01 | 2016 07-01 | 9 | 520 | 2016-04-0 | 2016-08-01 |'Test dates fall completely inside an existing tenure'
最佳答案
在我花了一天时间在运行机上运行并思考之后,我相信我找到了答案。为了其他人的利益,我将其张贴在这里。我将与 tbl_member 的连接移动到子查询中,为了完整起见,包括另一个子查询以从第三个表 tbl_position 获取职位的实际标题,如下所示。 (看不到用连接替换子查询的方法,但这没关系。)
TABLE tbl_positions
(
position_id INT AUTO_INCREMENT, -- pk
position VARCHAR(100), -- title of position
<other stuff>
)
下面是我想出的代码,它似乎可以正常工作,并显示了所有重叠以及谁与谁重叠的详细信息、时间和原因。
唯一的小问题是,例如,如果 Fred 的总统任期与 Jim 的现有记录重叠,原因是 Fred 的任期完全包含 Jim 的任期,那么 Jim 的总统职位也将与 Fred 的现有任期记录重叠原因是 Fred's 完全被 Jim's 包围了。即我得到了重叠的两边。
如果有一种快速获得“单向”重叠的方法,那么一定要发布一个更好的答案。
我的回答
SELECT
base_tenure.position_id AS base_tenure_id,
base_tenure.member_id AS base_member_id,
(SELECT member_sn FROM tbl_member WHERE tbl_member.member_id = base_tenure.member_id) AS base_sn,
(SELECT tbl_positions.position FROM tbl_positions WHERE tbl_positions.position_id = base_tenure.position_id ) AS POSITION,
base_tenure.date_started AS base_date_started,
base_tenure.date_ended AS base_date_ended,
overlap_tenure.position_id AS overlap_tenure_id,
overlap_tenure.member_id AS overlap_member_id,
(SELECT member_sn FROM tbl_member WHERE tbl_member.member_id = overlap_tenure.member_id) AS overlap_sn,
overlap_tenure.date_started AS overlap_date_started,
overlap_tenure.date_ended AS overlap_date_ended,
CASE
WHEN base_tenure.date_ended <= IFNULL(overlap_tenure.date_ended, CURDATE())-- test end date <= existing end date
AND base_tenure.date_started >= overlap_tenure.date_started -- test start date >= existing start date
THEN 'tbl_member dates fall completely inside an existing tenue'
WHEN base_tenure.date_ended >= IFNULL(overlap_tenure.date_ended, CURDATE()) -- test end date >= existing end date
AND base_tenure.date_started <= overlap_tenure.date_started -- test start date <= existing start date
THEN 'An existing tenue falls completely inside tbl_member dates'
WHEN base_tenure.date_started >= overlap_tenure.date_started -- test start date >= existing start date
AND base_tenure.date_started <= IFNULL( overlap_tenure.date_ended , CURDATE()) -- test start date <= existing end date
THEN 'tbl_member start date overlaps with an existing tenue'
WHEN base_tenure.date_ended >= overlap_tenure.date_started -- test end date >= existing start date
AND base_tenure.date_ended <= IFNULL( overlap_tenure.date_ended , CURDATE())-- test end date <= existing end date
THEN 'tbl_member end date overlaps with an existing tenue'
END AS reason
FROM -- a self join on tbl_tenure
tbl_tenure AS base_tenure,
tbl_tenure AS overlap_tenure
WHERE (-- there is an overlap (see qry 2.2 http://salman-w.blogspot.co.uk/2012/06/sql-query-overlapping-date-ranges.html
base_tenure.date_ended >= overlap_tenure.date_started -- test end date >= existing start date
AND
IFNULL(overlap_tenure.date_ended, CURDATE()) >= base_tenure.date_started
)
AND
base_tenure.club_function_id = overlap_tenure.club_function_id -- positions are the same for both members
AND
base_tenure.position_id <> overlap_tenure.position_id -- don't compare the base record with itself as they are identical and will always overlap
ORDER BY
(SELECT member_sn FROM tbl_member WHERE tbl_member.member_id = base_tenure.member_id) ,
base_tenure.date_started ;
关于MySQL - 如何进行自连接以返回重叠的日期范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39916220/
我的数据库中有两张表,一张用于 field ,另一张用于预订。我需要的是一个查询来选择所有未预订的 field 。见下文: 餐 table 预订具有以下字段: bk_id venue_id 作为(预订
嗨,我是编码新手,我有一些培训项目,其中包括从 HTML 表单输入 MySQL 数据库。它就像你玩过的游戏的日志。第一个日期输入是您开始游戏的时间,第二个日期输入是您完成游戏的时间。但我需要检查器或类
我是这个 sql 编码的新手,我正在尝试学习新的东西。因此,我创建了一个交货表,其中包含一些属性,如商品代码、交货日期、交货数量。所以如何从同一张表中获取第一个交货日期(最小日期)和交货数量以及最晚交
我从支付网关返回了这个日期 2014-05-15T08:40:52+01:00 我得到 2014-05-15T08:40:52 但我无法识别时区 +01:00 的含义 我的位置时区是 UTC−06:0
我快要疯了,请帮忙。 我有一列包含日期时间值。 我需要找到每天的最小值和最大值。 数据看起来像这样 2012-11-23 05:49:26.000 2012-11-23 07:55:43.000
我从 json 数据中获取日期为 2015 年 4 月 15 日晚上 10:15我只想在 html 页面中显示 json 响应数据的时间,例如 10:15 PM这里我放了我的js函数和html代码 J
是否有 javascript 库或其他机制允许我将 .NET 日期/时间格式字符串(即 yyyy-MM-dd HH:mm:ss)传递给 javascript函数并让它相应地解析提供的日期时间值?我一直
我正在使用以下代码以正确的格式获取当前的 UTC 时间,但客户返回并要求时间戳现在使用 EST 而不是 UTC。我搜索了 Google 和 stackoverflow,但找不到适用于我现有代码的答案。
我有以下日期的平均温度数据。我想找到连续至少 5 天低于或高于 0 摄氏度的开始日期。 date_short mean.temp 1 2018-05-18 17.54 2 2018-05-19
它可以在其他网络浏览器中使用,但 IE11 返回无效日期。 为了调试我使用了下面的代码。 console.log('before - ' + date.value); date.value = new
我在 Excel 中有一个数据的 Web 提取,其中日期列带有/Date(1388624400000)/。我需要在 Excel 中将其转换为日期。 最佳答案 能够从 here 中推断出它. 假设字符串
嗨,我的 Schmema 有一个带有 ISO 日期的字段: ISODate("2015-04-30T14:47:46.501Z") Paypal 在成功付款后以该形式返回日期对象: Time/Date
我的 table : CREATE TABLE `tbdata` ( `ID` INT(10) NOT NULL AUTO_INCREMENT, `PatientID` INT(10) NOT
我正在 Ubuntu 服务器 12.04 中编写一个 shell 脚本,它应该比较日志文件中的一些数据。在日志文件中,日期以以下格式给出: [Mon Apr 08 15:02:54 2013] 如您所
我想使用 GROUP BY WITH ROLLUP 创建一个表并获取总行数而不是 null。 $sql ="SELECT IF(YEAR(transaktioner.datum
我正在创建博客文章,在成功迁移我的博客文件后,当我转到我网站的博客页面时返回一个错误(无法解析其余部分:':“Ymd”'来自'post.date|date: "Ymd"') 我似乎无法确定这是语法错误
我正在尝试获取要插入到 CAML 查询中的月份范围,即:2010-09-01 和 2010-09-30。 我使用以下代码生成这两个值: var month = "10/2010"; var month
如何将代码document.write("直到指定日期")更改为writeMessage(date)中的日期?此外,writeMessage(date) 中的日期未正确显示(仅显示年份)。感谢您帮助解
我在 Windows (XP) 和 Linux 上都尝试过 utime()。在 Windows 上我得到一个 EACCES 错误,在 Linux 上我没有得到任何错误(但时间没有改变)。我的 utim
我正在尝试计算发生在同一日期的值的总和(在 XYZmin 中)。 我的数据看起来像这样, bar <- structure(list(date = structure(c(15622, 15622,
我是一名优秀的程序员,十分优秀!