亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

獲取兩個日期之間的日期列表

獲取兩個日期之間的日期列表

哆啦的時光機 2019-06-15 10:35:29
獲取兩個日期之間的日期列表使用標準的MySQL函數可以編寫一個查詢,該查詢將返回兩個日期之間的天數列表。給定2009-01-01和2009-01-13,它將返回一個列表,其值為: 2009-01-01   2009-01-02   2009-01-03  2009-01-04   2009-01-05  2009-01-06  2009-01-07  2009-01-08   2009-01-09  2009-01-10  2009-01-11  2009-01-12  2009-01-13編輯:看來我還不清楚。我想生成這個列表。我的值存儲在數據庫中(按日期時間),但希望將它們聚集在左側的外部聯接中,如上面所示,將它們聚合到一個日期列表中(我在某些連接的右側期望NULL為NULL,并將處理此值)。
查看完整描述

3 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

我將使用這個存儲過程將所需的時間間隔生成到名為時間間隔,然后使用temp連接和聚合數據表。時間間隔桌子。

該過程可以生成在其中指定的所有不同類型的間隔:

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_i
ntervals('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-0
1 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_st
art 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 (un
 
 itval) 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構建了一個類似的函數。


查看完整回答
反對 回復 2019-06-15
?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

對于MSSQL,可以使用此方法。非??臁?/trans>

您可以將其封裝在表值函數或存儲的proc中,并以變量的形式解析開始日期和結束日期。

DECLARE @startDate DATETIMEDECLARE @endDate DATETIMESET @startDate = '2011-01-01'SET @endDate = '2011-01-31';WITH dates(Date) AS (
    SELECT @startdate as Date    UNION ALL
    SELECT DATEADD(d,1,[Date])
    FROM dates 
    WHERE DATE < @enddate)SELECT DateFROM datesOPTION (MAXRECURSION 0)GO


查看完整回答
反對 回復 2019-06-15
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

我們對BIRT報告也有類似的問題,因為我們想報告那些沒有數據的日子。由于這些日期沒有條目,所以最簡單的解決方案是創建一個簡單的表,存儲所有日期,并使用該表獲取范圍或聯接以獲得該日期的零值。

我們有一個每個月運行的任務,以確保表在未來5年內被填充。表是這樣創建的:

create table all_dates (
    dt date primary key);

毫無疑問,對于不同的DBMS,有一些不可思議的方法可以實現這一點,但是我們總是選擇最簡單的解決方案。表的存儲需求很小,這使得查詢更加簡單和可移植。從性能角度看,這種解決方案幾乎總是更好,因為它不需要對數據進行逐行計算。

另一個選項(我們以前使用過)是確保每個日期的表中都有一個條目。我們定期掃描表,并為不存在的日期和/或時間添加零項。在您的情況下,這可能不是一個選項,它取決于存儲的數據。

如果你真的我覺得這是個麻煩all_dates表填充后,存儲過程將返回包含這些日期的數據集。這幾乎肯定會慢一些,因為每次調用它時都要計算范圍,而不是僅僅從表中提取預先計算出來的數據。

但是,老實說,您可以在1000年內填充該表,而不會出現任何嚴重的數據存儲問題-比如365,000個16字節(例如)日期-再加上一個與日期重復的索引加上20%的安全開銷,我估計大約為1400萬(365,000*16*2*1.2=14,016,000字節),這是事物方案中的一個極小的表。


查看完整回答
反對 回復 2019-06-15
  • 3 回答
  • 0 關注
  • 750 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號