SQL:如何检查我的日程安排是否正常

时间:2017-02-08 09:26:08

标签: sql mariadb

我有一个看起来像这样的数据库:

FromDate                     ToDate         ProfileUID 
2017-02-10 07:00:00   2017-02-10 15:30:00   TB_D 
2017-02-09 23:00:00   2017-02-10 07:00:00   ZK_D 
2017-02-09 17:30:00   2017-02-09 23:00:00   DL_D 
2017-02-09 07:00:00   2017-02-09 17:30:00   AM_D 
2017-02-08 23:00:00   2017-02-09 07:00:00   CK_D 
2017-02-08 17:30:00   2017-02-08 23:00:00   DJ_N

此DB通常是手动修改的,用户可以完成一些错误。

我正在尝试进行SQL查询以检查时间表是否正常,这意味着我想知道直到我的记录为止(这里我们只填写了接下来的两天)以及是否没有“黑色”计划中的“漏洞”,意味着没有填充profileUID的期间。

到目前为止我所拥有的:

SELECT *,LAG (ToDate) OVER (PARTITION BY FromDate ORDER BY FromDate) 
FROM `dashboardcalendar` 
WHERE FromDate>= NOW() 
ORDER BY `dashboardcalendar`.`FromDate`  ASC

1 个答案:

答案 0 :(得分:0)

编辑:鉴于你不能在你的MariaDB版本上使用窗口函数,试试这个:

SELECT FromDate, ToDate, ProfileUID, next_FromDate, last_ToDate,
CASE WHEN next_record_uid is null then 'Warning - Gap after' end warn1,
CASE WHEN prev_record_uid is null then 'Warning - Gap before' end warn2
FROM (
SELECT t1.FromDate, t1.ToDate, t1.ProfileUID, 
t2.ProfileUID next_record_uid, 
t3.ProfileUID prev_record_uid 
FROM table t1
LEFT JOIN table t2
ON t1.ToDate = t2.FromDate
LEFT JOIN table t3
ON t1.FromDate = t3.ToDate
)

这并不考虑时间上的重叠 - 如果两个时间段重叠,它会给出误报警。

原始答案:

我使用LEAD和LAG,然后用另一个select进行比较:

SELECT FromDate, ToDate, ProfileUID, next_FromDate, last_ToDate,
CASE WHEN ToDate < next_FromDate then 'Warning - Gap after' end warn1,
CASE WHEN FromDate > last_ToDate then 'Warning - Gap before' end warn2
FROM (
SELECT FromDate, ToDate, ProfileUID, 
LEAD(FromDate,1) OVER (ORDER BY FromDate) next_FromDate,
LAG(FromDate,1) OVER (ORDER BY FromDate) last_ToDate
FROM table
)

你不需要分区,听起来就像你的描述一样,每条记录都涵盖了一段不同的时间,所以没有什么可以分组。