簡體   English   中英

如何在沒有硬編碼的情況下獲取時間范圍數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM