如何从星期四或一周中的任何其他一天开始的每周结果改进我的 SQL 语句?

Jam*_*ann 8 mysql mariadb

我是个新手,我在任何地方都找不到这样做的好方法。我有一个数据库表,其中包含在一周内不同时间记录的统计信息。报告周从星期四开始。该表包含一个日期戳列(日期),用于存储数据的记录时间。

我需要提取给定周的数据(报告周从周四开始)。我编写了以下查询:

   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。

Rol*_*DBA 5

这是我写的一个查询,给你最近的星期四和星期三结束

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) 星期几从星期日开始到星期六结束