我有一個presence具有以下結構的 MySQL 表:
- 編號:1
- 用戶名:1??4
- 開始時間: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為空,則應檢查未來的每個星期一,無休止。星期一按start日期給出,也可以每隔一天。
repetitive給我檢查那個給定的日期start。如果repetitive是 0,它應該像我的查詢一樣檢查日期是否在start和之間end。
人工查詢:從presence表中獲取給定日期在開始和結束之間(如果結束不為空)并且給定日期是開始日期的所有行。
uj5u.com熱心網友回復:
從存在中獲取所有行,其中給定日期在開始和結束之間,如果結束不為空并且給定日期是開始日期。
可以人工翻譯為:
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`)
)
uj5u.com熱心網友回復:
直接回答帖子標題中提出的問題,您可以使用:
DAYOFWEEK ( date ):回傳日期的作業日索引(1 = 星期日,2 = 星期一,……,7 = 星期六)。這些索引值對應于 ODBC 標準。
WEEKDAY ( date ):回傳日期的作業日索引(0 = 星期一,1 = 星期二,... 6 = 星期日)。
DAYNAME ( date ):回傳日期的作業日名稱。用于名稱的語言由 lc_time_names 系統變數的值控制
但是在您對所需查詢的描述中,您說
從存在中獲取所有行,其中給定日期在開始和結束之間,如果結束不為空并且給定日期是開始日期。(我的重點)
這意味著您需要start范圍內日期名稱/索引的實體數。為此,您可以使用不同的方法將范圍外推到行并從中選擇所需的日期。
日歷表最好,因為您已經可以在表中的資料中構建日期名稱/索引。
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`);
這是構建日歷表的示例,它特定于 MSSQL,因此可能需要針對 MySQL 修改某些查詢,但您明白了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/349056.html
