[英]How to get time range data without hardcoding
我喜歡以下查詢。 現在我想3 days ago from now()
我總是硬編碼如下
select
id
,coalesce(sum(case when snapshot_day in ('2021-05-03') then 1 else 0 end), 0) AS "2021-05-03"
,coalesce(sum(case when snapshot_day in ('2021-05-04') then 1 else 0 end), 0) AS "2021-05-04"
,coalesce(sum(case when snapshot_day in ('2021-05-05') then 1 else 0 end), 0) AS "2021-05-05"
from talble
where type in ('Daily')
group by 1
有沒有什么好方法可以在沒有硬編碼的情況下獲得結果?
如果有一些例子,有人有意見,請告訴我
謝謝
現在可以使用():
select
id
,coalesce(sum(case when snapshot_day = cast(now() as date) - interval 2 day then 1 else 0 end), 0) AS "Day before yesterday"
,coalesce(sum(case when snapshot_day = cast(now() as date) - interval 1 day then 1 else 0 end), 0) AS yesterday
,coalesce(sum(case when snapshot_day = cast(now() as date) then 1 else 0 end), 0) AS today
from talble
where type in ('Daily')
and snapshot_day >= cast(now() as date) - interval 2 day
group by id
您可以使用PREPARED STATEMENT來執行此操作:
我在 WHERE 子句中添加了一個比較,以便從表中僅獲得 3 天。
SELECT CONCAT("SELECT id ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 3 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 3 DAY),"' ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 2 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 2 DAY),"' ",
",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 1 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 1 DAY),"' ",
"FROM talble ",
"WHERE type in ('Daily') ",
" AND snapshot_day BETWEEN DATE(NOW()) - INTERVAL 3 DAY + INTERVAL 0 SECOND ",
"AND DATE(NOW()) - INTERVAL 0 DAY - INTERVAL 1 SECOND "
"GROUP BY 1") INTO @myquery;
SELECT @myquery;
PREPARE stmt FROM @myquery;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
樣本
MariaDB [Bernd]> SELECT * FROM talble;
+----+-------+---------------------+
| id | type | snapshot_day |
+----+-------+---------------------+
| 1 | Daily | 2021-05-04 00:00:00 |
| 2 | Daily | 2021-05-05 00:00:00 |
| 3 | Daily | 2021-05-05 00:00:00 |
| 4 | Daily | 2021-05-06 00:00:00 |
| 5 | Daily | 2021-05-06 00:00:00 |
| 6 | Daily | 2021-05-04 00:00:00 |
| 7 | Daily | 2021-05-07 00:00:00 |
+----+-------+---------------------+
7 rows in set (0.02 sec)
MariaDB [Bernd]> SELECT CONCAT("SELECT id ",
-> ",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 3 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 3 DAY),"' ",
-> ",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 2 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 2 DAY),"' ",
-> ",coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 1 DAY), 1 ,0) )) AS '",date(now() - INTERVAL 1 DAY),"' ",
-> "FROM talble ",
-> "WHERE type in ('Daily') ",
-> "GROUP BY 1") INTO @myquery;
Query OK, 1 row affected (0.01 sec)
MariaDB [Bernd]>
MariaDB [Bernd]> SELECT @myquery;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| @myquery |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| SELECT id ,coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 3 DAY), 1 ,0) )) AS '2021-05-04' ,coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 2 DAY), 1 ,0) )) AS '2021-05-05' ,coalesce( sum( IF( snapshot_day = date(now() - INTERVAL 1 DAY), 1 ,0) )) AS '2021-05-06' FROM talble WHERE type in ('Daily') GROUP BY 1 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
MariaDB [Bernd]>
MariaDB [Bernd]> PREPARE stmt FROM @myquery;
Query OK, 0 rows affected (0.01 sec)
Statement prepared
MariaDB [Bernd]> EXECUTE stmt;
+----+------------+------------+------------+
| id | 2021-05-04 | 2021-05-05 | 2021-05-06 |
+----+------------+------------+------------+
| 1 | 1 | 0 | 0 |
| 2 | 0 | 1 | 0 |
| 3 | 0 | 1 | 0 |
| 4 | 0 | 0 | 1 |
| 5 | 0 | 0 | 1 |
| 6 | 1 | 0 | 0 |
| 7 | 0 | 0 | 0 |
+----+------------+------------+------------+
7 rows in set (0.00 sec)
MariaDB [Bernd]> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)
MariaDB [Bernd]>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.