MySQL:判断日期的工作日是否在SQL的两个工作日之间
MySQL: find out whether weekday of date is between two weekdays with SQL
我有这个 vb.NET 代码,想在 MySQL 中编写一个函数来做同样的事情。
Public Function IsWeekdayTimeInRange(DateToCheck As DateTime, StartDayOfWeek As DayOfWeek,
EndDayOfWeek As DayOfWeek) As Boolean
Dim WeekdaysInRange As New List(Of DayOfWeek)
WeekdaysInRange.Add(StartDayOfWeek)
Dim i As Integer = StartDayOfWeek
While i <> EndDayOfWeek
i += 1
i = If(i = 7, 0, i)
WeekdaysInRange.Add(i)
End While
Return WeekdaysInRange.Contains(DateToCheck.DayOfWeek)
End Function
在 MySQL 我目前处于这一点,但由于我从未编写过 SQL 函数,因此我需要一些帮助。
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result BOOLEAN;
DECLARE i INT;
SET result = false;
SET weekdayToCheck = WEEKDAY(d);
SET i = s;
WHILE(i <> e) DO
/* more logic here */
END WHILE;
RETURN result;
END; |
DELIMITER ;
编辑:由于我现在了解到 MySQL 具有 Weekday(Monday) = 0
,因此我的函数也需要转换为 Weekday(Sunday) = 0
,因为我的数据使用该格式。
不确定您对 "between" 的定义是什么,但在这里我使用了大于和小于
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result INT;
SET weekdayToCheck = WEEKDAY(d);
SET result = 0;
IF (s < e) THEN
IF (weekdayToCheck > s AND weekdayToCheck < e) THEN SET result = 1;
END IF;
END IF;
IF (s > e) THEN
IF (weekdayToCheck > s OR weekdayToCheck < e) THEN SET result = 1;
END IF;
END IF;
RETURN result;
END;
也许所有的 if/else 子句都可以缩短一些。
考虑从星期一开始一周。希望这会有所帮助:
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result TINYINT(1);
SET weekdayToCheck = WEEKDAY(d);
SET result = 0;
IF(weekdayToCheck > s AND weekdayToCheck < e) THEN
SET result = 1;
ELSEIF (s > e AND weekdayToCheck < s AND weekdayToCheck < e) THEN
SET result = 1;
END IF;
RETURN result;
END; |
DELIMITER ;
现在可以了。它可能会更简洁,但它帮助我想通了。
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT, FirstDayOfWeekIsSunday BOOLEAN)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result BOOLEAN;
DECLARE i INT;
SET result = false;
SET weekdayToCheck = WEEKDAY(d);
SET i = s;
IF FirstDayOfWeekIsSunday = TRUE THEN
SET weekdayToCheck = weekdayToCheck + 1;
IF weekdayToCheck = 7 THEN
SET weekdayToCheck = 0;
END IF;
END IF;
IF weekdayToCheck = s THEN
SET result = true;
END IF;
WHILE(i <> e) DO
SET i = i + 1;
IF i = 7 THEN
SET i = 0;
END IF;
IF weekdayToCheck = i THEN
SET result = true;
END IF;
END WHILE;
RETURN result;
END; |
DELIMITER ;
编辑:修复了循环中的顺序问题。如果假设一周从星期日开始,还添加了处理 s
和 e
的选项。
编辑:测试了上面的内容并且它有效。还创建一个函数,可以检查 DateTime 是否在星期二下午 3 点和星期四凌晨 2 点之间。
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS_AND_TIME(d DATETIME, s INT, starttime TIME, e INT, endtime TIME, FirstDayOfWeekIsSunday BOOLEAN)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result BOOLEAN;
DECLARE i INT;
DECLARE dTime TIME;
SET result = false;
SET weekdayToCheck = WEEKDAY(d);
SET i = s;
SET dTime = DATE_FORMAT(d, '%H:%i:%s');
IF FirstDayOfWeekIsSunday = TRUE THEN
SET weekdayToCheck = weekdayToCheck + 1;
IF weekdayToCheck = 7 THEN
SET weekdayToCheck = 0;
END IF;
END IF;
IF weekdayToCheck = s THEN
IF ((weekdayToCheck = s AND dTime > starttime) OR (weekdayToCheck = e AND dTime < endtime) OR (weekdayToCheck <> s AND weekdayToCheck <> e)) THEN
SET result = true;
END IF;
END IF;
WHILE(i <> e) DO
SET i = i + 1;
IF i = 7 THEN
SET i = 0;
END IF;
IF weekdayToCheck = i THEN
IF ((weekdayToCheck = s AND dTime > starttime) OR (weekdayToCheck = e AND dTime < endtime) OR (weekdayToCheck <> s AND weekdayToCheck <> e)) THEN
SET result = true;
END IF;
END IF;
END WHILE;
RETURN result;
END; |
DELIMITER ;
我有这个 vb.NET 代码,想在 MySQL 中编写一个函数来做同样的事情。
Public Function IsWeekdayTimeInRange(DateToCheck As DateTime, StartDayOfWeek As DayOfWeek,
EndDayOfWeek As DayOfWeek) As Boolean
Dim WeekdaysInRange As New List(Of DayOfWeek)
WeekdaysInRange.Add(StartDayOfWeek)
Dim i As Integer = StartDayOfWeek
While i <> EndDayOfWeek
i += 1
i = If(i = 7, 0, i)
WeekdaysInRange.Add(i)
End While
Return WeekdaysInRange.Contains(DateToCheck.DayOfWeek)
End Function
在 MySQL 我目前处于这一点,但由于我从未编写过 SQL 函数,因此我需要一些帮助。
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result BOOLEAN;
DECLARE i INT;
SET result = false;
SET weekdayToCheck = WEEKDAY(d);
SET i = s;
WHILE(i <> e) DO
/* more logic here */
END WHILE;
RETURN result;
END; |
DELIMITER ;
编辑:由于我现在了解到 MySQL 具有 Weekday(Monday) = 0
,因此我的函数也需要转换为 Weekday(Sunday) = 0
,因为我的数据使用该格式。
不确定您对 "between" 的定义是什么,但在这里我使用了大于和小于
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result INT;
SET weekdayToCheck = WEEKDAY(d);
SET result = 0;
IF (s < e) THEN
IF (weekdayToCheck > s AND weekdayToCheck < e) THEN SET result = 1;
END IF;
END IF;
IF (s > e) THEN
IF (weekdayToCheck > s OR weekdayToCheck < e) THEN SET result = 1;
END IF;
END IF;
RETURN result;
END;
也许所有的 if/else 子句都可以缩短一些。
考虑从星期一开始一周。希望这会有所帮助:
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result TINYINT(1);
SET weekdayToCheck = WEEKDAY(d);
SET result = 0;
IF(weekdayToCheck > s AND weekdayToCheck < e) THEN
SET result = 1;
ELSEIF (s > e AND weekdayToCheck < s AND weekdayToCheck < e) THEN
SET result = 1;
END IF;
RETURN result;
END; |
DELIMITER ;
现在可以了。它可能会更简洁,但它帮助我想通了。
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS(d DATETIME, s INT, e INT, FirstDayOfWeekIsSunday BOOLEAN)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result BOOLEAN;
DECLARE i INT;
SET result = false;
SET weekdayToCheck = WEEKDAY(d);
SET i = s;
IF FirstDayOfWeekIsSunday = TRUE THEN
SET weekdayToCheck = weekdayToCheck + 1;
IF weekdayToCheck = 7 THEN
SET weekdayToCheck = 0;
END IF;
END IF;
IF weekdayToCheck = s THEN
SET result = true;
END IF;
WHILE(i <> e) DO
SET i = i + 1;
IF i = 7 THEN
SET i = 0;
END IF;
IF weekdayToCheck = i THEN
SET result = true;
END IF;
END WHILE;
RETURN result;
END; |
DELIMITER ;
编辑:修复了循环中的顺序问题。如果假设一周从星期日开始,还添加了处理 s
和 e
的选项。
编辑:测试了上面的内容并且它有效。还创建一个函数,可以检查 DateTime 是否在星期二下午 3 点和星期四凌晨 2 点之间。
DELIMITER |
CREATE FUNCTION IS_BETWEEN_WEEKDAYS_AND_TIME(d DATETIME, s INT, starttime TIME, e INT, endtime TIME, FirstDayOfWeekIsSunday BOOLEAN)
RETURNS BOOLEAN DETERMINISTIC
BEGIN
DECLARE weekdayToCheck INT;
DECLARE result BOOLEAN;
DECLARE i INT;
DECLARE dTime TIME;
SET result = false;
SET weekdayToCheck = WEEKDAY(d);
SET i = s;
SET dTime = DATE_FORMAT(d, '%H:%i:%s');
IF FirstDayOfWeekIsSunday = TRUE THEN
SET weekdayToCheck = weekdayToCheck + 1;
IF weekdayToCheck = 7 THEN
SET weekdayToCheck = 0;
END IF;
END IF;
IF weekdayToCheck = s THEN
IF ((weekdayToCheck = s AND dTime > starttime) OR (weekdayToCheck = e AND dTime < endtime) OR (weekdayToCheck <> s AND weekdayToCheck <> e)) THEN
SET result = true;
END IF;
END IF;
WHILE(i <> e) DO
SET i = i + 1;
IF i = 7 THEN
SET i = 0;
END IF;
IF weekdayToCheck = i THEN
IF ((weekdayToCheck = s AND dTime > starttime) OR (weekdayToCheck = e AND dTime < endtime) OR (weekdayToCheck <> s AND weekdayToCheck <> e)) THEN
SET result = true;
END IF;
END IF;
END WHILE;
RETURN result;
END; |
DELIMITER ;