【发布时间】:2021-12-19 01:20:00
【问题描述】:
我想构建一个特定的日历功能。
作为地下室,我有以下 MySQL 表:
CREATE TABLE `presence` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`eid` int(10) unsigned DEFAULT NULL,
`start` timestamp NULL DEFAULT NULL,
`end` timestamp NULL DEFAULT NULL,
`frequence` int(11) DEFAULT NULL,
`fulltime` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
使用以下示例数据:
INSERT INTO `presence` (`id`, `eid`, `start`, `end`, `frequence`, `fulltime`) VALUES (1, 14, "2021-11-29 10:00:00", "2021-12-13 18:00:00", NULL, NULL);
INSERT INTO `presence` (`id`, `eid`, `start`, `end`, `frequence`, `fulltime`) VALUES (2, 14, "2021-11-29 10:00:00", "2021-12-13 18:00:00", 1, NULL);
INSERT INTO `presence` (`id`, `eid`, `start`, `end`, `frequence`, `fulltime`) VALUES (3, 14, "2021-11-29 10:00:00", "2021-12-13 18:00:00", 1, 1);
INSERT INTO `presence` (`id`, `eid`, `start`, `end`, `frequence`, `fulltime`) VALUES (4, 14, "2021-11-29 10:00:00", "2021-12-13 18:00:00", NULL, 1);
INSERT INTO `presence` (`id`, `eid`, `start`, `end`, `frequence`, `fulltime`) VALUES (5, 14, "2021-11-29 10:00:00", NULL, 1, 1);
在我的应用环境中,我有以下示例:
row id#1 表示,从 2021 年 11 月 29 日到 2021 年 12 月 13 日,每天都有员工(eid:14)在场。每天上午 10 点到下午 6 点。
row id#2 表示,从 2021 年 11 月 29 日到 2021 年 12 月 13 日,每个星期一都有一名员工 (eid: 14) 在场。每个星期一上午 10 点到下午 6 点。星期一,因为start 是星期一,因为frequence = 1。
row id#3 表示,从 2021 年 11 月 29 日到 2021 年 12 月 13 日,每个星期一都有一名员工 (eid: 14) 在场。每个星期一全天,因为fullday = 1。因此,忽略时间。
row id#4 表示,从 2021 年 11 月 29 日到 2021 年 12 月 13 日,每天都有员工(eid:14)在场。每天一整天,因为fullday = 1 再次告诉忽略时间。
row id#5 终于有了一个开放式的存在。这意味着该员工从 2021 年 11 月 29 日每周一到无限期都在场。
我整天都在处理以下查询,现在我无法说出我的期望......
SET @date = "2021-12-13 19:00:00";
SET @fullday = 0;
SELECT start, end, frequence, fulltime
FROM `presence`
WHERE (
IF (@fullday = 1,
DATE(@date) >= DATE(`start`)
,
DATE(@date) >= DATE(`start`) AND
TIME(@date) >= TIME(`start`)
)
)
AND (
IF (@fullday = 1,
DATE(@date) >= DATE(`end`)
,
DATE(@date) >= DATE(`end`) AND
TIME(@date) >= TIME(`end`)
)
)
AND (
`frequence` IS NULL OR
`frequence` = 1 AND WEEKDAY(@date) = WEEKDAY(`start`)
)
在我的应用程序中,我将有一个 php 函数 employee_is_present(int $eid, string $date): bool,其中 $date 可以是 Y-m-d H:i:s 或只是 Y-m-d,以检查员工是否通常在一天(没有时间)或在a 非常具体的时间。这就是我尝试使用 SET @fullday = 0|1;
【问题讨论】:
-
您构建了一个函数,该函数使用 hiur 制作所有日期的序列,以便您拥有一个包含所有工作时间行的临时表,并检查其中是否包含特定日期跨度>