sql >> データベース >  >> RDS >> Mysql

2つの日付の間の日付のリストを取得します

    このストアドプロシージャを使用して、 time_intervalsという名前の一時テーブルに必要な間隔を生成します 、次にJOINして、データテーブルをtemp time_intervalsで集計します テーブル。

    この手順では、指定されているすべての異なるタイプの間隔を生成できます。

    call make_intervals('2009-01-01 00:00:00','2009-01-10 00:00:00',1,'DAY')
    .
    select * from time_intervals  
    .
    interval_start      interval_end        
    ------------------- ------------------- 
    2009-01-01 00:00:00 2009-01-01 23:59:59 
    2009-01-02 00:00:00 2009-01-02 23:59:59 
    2009-01-03 00:00:00 2009-01-03 23:59:59 
    2009-01-04 00:00:00 2009-01-04 23:59:59 
    2009-01-05 00:00:00 2009-01-05 23:59:59 
    2009-01-06 00:00:00 2009-01-06 23:59:59 
    2009-01-07 00:00:00 2009-01-07 23:59:59 
    2009-01-08 00:00:00 2009-01-08 23:59:59 
    2009-01-09 00:00:00 2009-01-09 23:59:59 
    .
    call make_intervals('2009-01-01 00:00:00','2009-01-01 02:00:00',10,'MINUTE')
    . 
    select * from time_intervals
    .  
    interval_start      interval_end        
    ------------------- ------------------- 
    2009-01-01 00:00:00 2009-01-01 00:09:59 
    2009-01-01 00:10:00 2009-01-01 00:19:59 
    2009-01-01 00:20:00 2009-01-01 00:29:59 
    2009-01-01 00:30:00 2009-01-01 00:39:59 
    2009-01-01 00:40:00 2009-01-01 00:49:59 
    2009-01-01 00:50:00 2009-01-01 00:59:59 
    2009-01-01 01:00:00 2009-01-01 01:09:59 
    2009-01-01 01:10:00 2009-01-01 01:19:59 
    2009-01-01 01:20:00 2009-01-01 01:29:59 
    2009-01-01 01:30:00 2009-01-01 01:39:59 
    2009-01-01 01:40:00 2009-01-01 01:49:59 
    2009-01-01 01:50:00 2009-01-01 01:59:59 
    .
    I specified an interval_start and interval_end so you can aggregate the 
    data timestamps with a "between interval_start and interval_end" type of JOIN.
    .
    Code for the proc:
    .
    -- drop procedure make_intervals
    .
    CREATE PROCEDURE make_intervals(startdate timestamp, enddate timestamp, intval integer, unitval varchar(10))
    BEGIN
    -- *************************************************************************
    -- Procedure: make_intervals()
    --    Author: Ron Savage
    --      Date: 02/03/2009
    --
    -- Description:
    -- This procedure creates a temporary table named time_intervals with the
    -- interval_start and interval_end fields specifed from the startdate and
    -- enddate arguments, at intervals of intval (unitval) size.
    -- *************************************************************************
       declare thisDate timestamp;
       declare nextDate timestamp;
       set thisDate = startdate;
    
       -- *************************************************************************
       -- Drop / create the temp table
       -- *************************************************************************
       drop temporary table if exists time_intervals;
       create temporary table if not exists time_intervals
          (
          interval_start timestamp,
          interval_end timestamp
          );
    
       -- *************************************************************************
       -- Loop through the startdate adding each intval interval until enddate
       -- *************************************************************************
       repeat
          select
             case unitval
                when 'MICROSECOND' then timestampadd(MICROSECOND, intval, thisDate)
                when 'SECOND'      then timestampadd(SECOND, intval, thisDate)
                when 'MINUTE'      then timestampadd(MINUTE, intval, thisDate)
                when 'HOUR'        then timestampadd(HOUR, intval, thisDate)
                when 'DAY'         then timestampadd(DAY, intval, thisDate)
                when 'WEEK'        then timestampadd(WEEK, intval, thisDate)
                when 'MONTH'       then timestampadd(MONTH, intval, thisDate)
                when 'QUARTER'     then timestampadd(QUARTER, intval, thisDate)
                when 'YEAR'        then timestampadd(YEAR, intval, thisDate)
             end into nextDate;
    
          insert into time_intervals select thisDate, timestampadd(MICROSECOND, -1, nextDate);
          set thisDate = nextDate;
       until thisDate >= enddate
       end repeat;
    
     END;
    

    この投稿 、SQLServer用に同様の関数を作成しました。



    1. SQL Serverシステムデータベース–システムデータベースの復元

    2. SQLServerの数値関数の概要

    3. phpMyAdminでルートログインを無効にする

    4. 上位nパーセント上位n%