如何检查日期是否是 MySQL 中一周中的特定日期?
How to check if a date is a specific day in the week in MySQL?
我有一个 MySQL table presence
具有以下结构:
- id: 1
- uid: 14
- 开始:2021-11-01 00:00:00
- 结束:2021-12-31 00:00:00
- 重复:1
这一行给我的信息是,用户 14 从 2021-11-01 到 2021-12-31 每周一都在场。
SELECT 1
FROM presences
WHERE 2021-11-15 BETWEEN DATE(`start`) AND DATE(`end`)
检查给定日期 (2021-11-15) 是否在他的出现日期之间,但我如何添加逻辑来检查“每周一”?此外,如果 end
为 null,则它应该在以后的每个星期一检查,没有结束。
星期一由 start
日期给出,也可以每隔一天。
repetitive
让我在 start
之前检查给定的那一天。如果 repetitive
为 0,它应该像我的查询一样检查日期是否在 start
和 end
之间。
人工查询:从 presence
table 获取所有行,其中给定日期介于开始和结束之间(如果结束不为空)并且给定日期是开始日期。
直接回答您post标题中提出的问题,您可以使用:
DAYOFWEEK(date): Returns date 的工作日索引 (1 = Sunday, 2 = Monday, …, 7 = 星期六)。这些索引值对应于ODBC标准。
WEEKDAY(date): Returns date 的工作日索引 (0 = Monday, 1 = Tuesday, … 6 = 星期日)。
DAYNAME(date): Returns date 的工作日名称。用于名称的语言由 lc_time_names 系统变量
的值控制
但是在你想要查询的描述中,你说
Get all rows from presence where given date is between start and end, if end is not null and where given day is day of start. (my emphasis)
这意味着您希望 start
日期日期 name/index 的实例数在您的范围内。为此,您可以使用不同的方法将范围外推到行,并从中选择所需的日期。
日历 table 最好,因为您已经可以将 name/index 日期构建到 table.
中的数据中
SELECT COUNT(*) as monday_count
FROM presences JOIN calendar
ON calendar.day_date BETWEEN DATE(`start`) AND DATE(`end`)
WHERE `end` IS NOT NULL AND calendar.day_name = DAYNAME(`start`);
这是一个 example of building a calendar table,它是特定于 MSSQL 的,因此可能需要针对 MySQL 修改一些查询,但您明白了。
Get all rows from presence where given date is between start and end,
if end is not null and where given day is day of start.
可以人工翻译为:
SELECT *
FROM t
WHERE '2021-11-15' >= `start`
AND (
'2021-11-15' <= `end` OR
`end` IS NULL
)
AND (
repetitive = 0 OR
repetitive = 1 AND WEEKDAY('2021-11-15') = WEEKDAY(`start`)
)
我有一个 MySQL table presence
具有以下结构:
- id: 1
- uid: 14
- 开始:2021-11-01 00:00:00
- 结束:2021-12-31 00:00:00
- 重复:1
这一行给我的信息是,用户 14 从 2021-11-01 到 2021-12-31 每周一都在场。
SELECT 1
FROM presences
WHERE 2021-11-15 BETWEEN DATE(`start`) AND DATE(`end`)
检查给定日期 (2021-11-15) 是否在他的出现日期之间,但我如何添加逻辑来检查“每周一”?此外,如果 end
为 null,则它应该在以后的每个星期一检查,没有结束。
星期一由 start
日期给出,也可以每隔一天。
repetitive
让我在 start
之前检查给定的那一天。如果 repetitive
为 0,它应该像我的查询一样检查日期是否在 start
和 end
之间。
人工查询:从 presence
table 获取所有行,其中给定日期介于开始和结束之间(如果结束不为空)并且给定日期是开始日期。
直接回答您post标题中提出的问题,您可以使用:
DAYOFWEEK(date): Returns date 的工作日索引 (1 = Sunday, 2 = Monday, …, 7 = 星期六)。这些索引值对应于ODBC标准。
WEEKDAY(date): Returns date 的工作日索引 (0 = Monday, 1 = Tuesday, … 6 = 星期日)。
DAYNAME(date): Returns date 的工作日名称。用于名称的语言由 lc_time_names 系统变量
的值控制
但是在你想要查询的描述中,你说
Get all rows from presence where given date is between start and end, if end is not null and where given day is day of start. (my emphasis)
这意味着您希望 start
日期日期 name/index 的实例数在您的范围内。为此,您可以使用不同的方法将范围外推到行,并从中选择所需的日期。
日历 table 最好,因为您已经可以将 name/index 日期构建到 table.
中的数据中SELECT COUNT(*) as monday_count
FROM presences JOIN calendar
ON calendar.day_date BETWEEN DATE(`start`) AND DATE(`end`)
WHERE `end` IS NOT NULL AND calendar.day_name = DAYNAME(`start`);
这是一个 example of building a calendar table,它是特定于 MSSQL 的,因此可能需要针对 MySQL 修改一些查询,但您明白了。
Get all rows from presence where given date is between start and end, if end is not null and where given day is day of start.
可以人工翻译为:
SELECT *
FROM t
WHERE '2021-11-15' >= `start`
AND (
'2021-11-15' <= `end` OR
`end` IS NULL
)
AND (
repetitive = 0 OR
repetitive = 1 AND WEEKDAY('2021-11-15') = WEEKDAY(`start`)
)