我是个新手,我在任何地方都找不到这样做的好方法。我有一个数据库表,其中包含在一周内不同时间记录的统计信息。报告周从星期四开始。该表包含一个日期戳列(日期),用于存储数据的记录时间。
我需要提取给定周的数据(报告周从周四开始)。我编写了以下查询:
SELECT *
FROM `table`
WHERE 1 = CASE
WHEN WEEKDAY(NOW()) = 0 THEN DATEDIFF(NOW(),`date`) BETWEEN -2 AND 4
WHEN WEEKDAY(NOW()) = 1 THEN DATEDIFF(NOW(),`date`) BETWEEN -1 AND 5
WHEN WEEKDAY(NOW()) = 2 THEN DATEDIFF(NOW(),`date`) BETWEEN -0 AND 6
WHEN WEEKDAY(NOW()) = 3 THEN DATEDIFF(NOW(),`date`) BETWEEN -6 AND 0
WHEN WEEKDAY(NOW()) = 4 THEN DATEDIFF(NOW(),`date`) BETWEEN -5 AND 1
WHEN WEEKDAY(NOW()) = 5 THEN DATEDIFF(NOW(),`date`) BETWEEN -4 AND 2
WHEN WEEKDAY(NOW()) = 6 THEN DATEDIFF(NOW(),`date`) BETWEEN -3 AND 3
END
Run Code Online (Sandbox Code Playgroud)
这似乎适用于初始测试。但我不确定这是最好的方法。我对 MySQL 的性能了解不多,但要过滤的记录将超过十万条。由于检查的条件数量,这个查询真的很慢吗?
提取最新报告时使用 NOW() 函数 - 但是,在某些情况下,我需要在其他几周内做报告 - 所以我会在该位置替换另一个日期。
此外,如果报告周发生变化,以这种方式执行此操作需要重新编写查询 - 例如开始日期更改为星期三。
我无法使用 WEEK() 函数,因为您只能在星期日或星期一使用它开始一周。
任何改进此查询的想法都非常感谢!
其他说明:目前使用 MariaDB 5.3。
这是我写的一个查询,给你最近的星期四和星期三结束
SELECT thuwk_beg + INTERVAL 0 second thu_beg,
thuwk_beg + INTERVAL 604799 second wed_end
FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;
Run Code Online (Sandbox Code Playgroud)
这是今天的一个例子,2011-09-21
mysql> SELECT
-> thuwk_beg + INTERVAL 0 second thu_beg,
-> thuwk_beg + INTERVAL 604799 second wed_end
-> FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
-> FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
-> FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;
+---------------------+---------------------+
| thu_beg | wed_end |
+---------------------+---------------------+
| 2011-09-15 00:00:00 | 2011-09-21 23:59:59 |
+---------------------+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
只需将 NOW() 函数调用替换为您喜欢的任何日期时间,您将在周四开始的一周中一直使用您选择的日期时间。
这是使用特定日期“2011-01-01”的另一个示例
mysql> SELECT
-> thuwk_beg + INTERVAL 0 second thu_beg,
-> thuwk_beg + INTERVAL 604799 second wed_end
-> FROM (SELECT (DATE('2011-01-01') - INTERVAL daysbacktothursday DAY) thuwk_beg
-> FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
-> FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE('2011-01-01') dt) AAAA) AAA) AA) A;
+---------------------+---------------------+
| thu_beg | wed_end |
+---------------------+---------------------+
| 2010-12-30 00:00:00 | 2011-01-05 23:59:59 |
+---------------------+---------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
您table今天的引用查询类似于以下内容:
SELECT * from `table`,
(SELECT thuwk_beg + INTERVAL 0 second thu_beg,
thuwk_beg + INTERVAL 604799 second wed_end
FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A) M
WHERE `date` >= thu_beg
AND `date` <= wed_end;
Run Code Online (Sandbox Code Playgroud)
试一试 !!!
更新 2011-09-22 16:27 EDT
这是我建议的标记周四至周三的查询。
SELECT thuwk_beg + INTERVAL 0 second thu_beg,
thuwk_beg + INTERVAL 604799 second wed_end
FROM (SELECT (DATE(NOW()) - INTERVAL daysbacktothursday DAY) thuwk_beg
FROM (SELECT SUBSTR('3456012',wkndx,1) daysbacktothursday
FROM (SELECT DAYOFWEEK(dt) wkndx FROM (SELECT DATE(NOW()) dt) AAAA) AAA) AA) A;
Run Code Online (Sandbox Code Playgroud)
其他星期怎么样???
(SELECT SUBSTR('6012345',wkndx,1) 从星期一开始到星期日结束的那一周(SELECT SUBSTR('5601234',wkndx,1) 从星期二开始到星期一结束的那一周(SELECT SUBSTR('4560123',wkndx,1) 从星期三开始到星期二结束的那一周(SELECT SUBSTR('3456012',wkndx,1) 从周四开始到周三结束的那一周(SELECT SUBSTR('2345601',wkndx,1) 从周五开始到周四结束的那一周(SELECT SUBSTR('1234560',wkndx,1) 从周六到周五的那一周(SELECT SUBSTR('0123456',wkndx,1) 星期几从星期日开始到星期六结束| 归档时间: |
|
| 查看次数: |
6252 次 |
| 最近记录: |