求出給定兩日期段 之間的交集演算法

來源:互聯網
上載者:User

---Sqlserver 預存程序
---本例的實現雖用sqlserver ,其實同樣可以應用到其它的語言中進行解決,因此將其作如下描述
---一點小小經驗希望能解決一些小的問題 呵呵
--歡迎大家交流

Create Procedure pGet_DateAmbitIntersection
(@A datetime, @B datetime, @L datetime, @R datetime ,
 @Result_L datetime output, @Result_R datetime output, @Result_LR int output)
---得到日期的交集
--@A 要進行比較的日期範圍左值
--@B 要進行比較的日期範圍右值
--@L 標準日期範圍左值
--@R 標準日期範圍右值
As
Begin
/*
[問題的提出]
假設有 A,B 與 L,R 四點, 其中 AB , 與 LR 為兩串連在一起的線段.求 在不同條件下 AB 與 LR 的交集?

[演算法理論]
現用C# 虛擬碼 描述如下:

if ( AB < LR )
 if ( A < L And A < R And B > L And B < R )  Return LB;
 if ( A = L And A < R And B > L And B < R )  Return AB;
 if ( A > L And A < R And B > L And B < R )  Return AB;
 if ( A > L And A < R And B > L And B = R )  Return AB;
 if ( A > L And A < R And B > L And B > R )  Return AR;
if ( AB = LR )
 if ( A < L And A < R And B > L And B < R )  Return LB;
 if ( A = L And A < R And B > L And B = R )  Return AB;
 if ( A > L And A < R And B > L And B > R )  Return AR;
if ( AB > LR )
 if ( A < L And A < R And B > L And B < R )  Return LB;
 if ( A < L And A < R And B = L And B = R )  Return LB;
 if ( A < L And A < R And B > L And B > R )  Return LR;
 if ( A = L And A < R And B > L And B > R )  Return LR;
 if ( A > L And A < R And B > L And B > R )  Return AL;
*/
--[問題的應用]
--- Declare @Result_LR int

 Declare @LR int, @AB int
 Select @LR = DATEDIFF(day, @L, @R)
 Select @AB = DATEDIFF(day, @A, @B)

 Select @Result_L = '1900-01-01'
 Select @Result_R = '1900-01-01'
 Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)

Print @A
Print @B
Print @L
Print @R
Print @AB
Print @LR

 if (@LR <= 0 or @AB <= 0)
 Begin
  Return
 End
---if ( AB < LR )
 if (@AB < @LR)
 Begin
--- if ( A < L And A < R And B > L And B < R )  Return LB;
  if ( @A < @L And @A < @R And @B > @L And @B < @R )
  Begin
   Select @Result_L = @L
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '< 1'
   Return
  End
--- if ( A = L And A < R And B > L And B < R )  Return AB;
  if ( @A = @L And @A < @R And @B > @L And @B < @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '< 2'
   Return
  End
--- if ( A > L And A < R And B > L And B < R )  Return AB;
  if ( @A > @L And @A < @R And @B > @L And @B < @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '< 3'
   Return
  End
--- if ( A > L And A < R And B > L And B = R )  Return AB;
  if ( @A > @L And @A < @R And @B > @L And @B = @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '< 4'
   Return
  End
--- if ( A > L And A < R And B > L And B > R )  Return AR;
  if ( @A > @L And @A < @R And @B > @L And @B > @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @R
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '< 5'
   Return
  End
 End
---if ( AB = LR )
 if (@AB = @LR)
 Begin
--- if ( A < L And A < R And B > L And B < R )  Return LB;
  if ( @A < @L And @A < @R And @B > @L And @B < @R )
  Begin
   Select @Result_L = @L
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '= 1'
   Return
  End
--- if ( A = L And A < R And B > L And B = R )  Return AB;
  if ( @A = @L And @A < @R And @B > @L And @B = @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '= 2'
   Return
  End
--- if ( A > L And A < R And B > L And B > R )  Return AR;
  if ( @A > @L And @A < @R And @B > @L And @B > @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @R
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '= 3'
   Return
  End
 End
--if ( AB > LR )
 if (@AB > @LR)
 Begin
-- if ( A < L And A < R And B > L And B < R )  Return LB;
  if ( @A < @L And @A < @R And @B > @L And @B < @R )
  Begin
   Select @Result_L = @L
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '> 1'
   Return
  End
-- if ( A < L And A < R And B = L And B = R )  Return LB;
  if ( @A < @L And @A < @R And @B = @L And @B = @R )
  Begin
   Select @Result_L = @L
   Select @Result_R = @B
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '> 2'
   Return
  End
-- if ( A < L And A < R And B > L And B > R )  Return LR;
  if ( @A < @L And @A < @R And @B > @L And @B > @R )
  Begin
   Select @Result_L = @L
   Select @Result_R = @R
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '> 3'
   Return
  End
-- if ( A = L And A < R And B > L And B > R )  Return LR;
  if ( @A = @L And @A < @R And @B > @L And @B > @R )
  Begin
   Select @Result_L = @L
   Select @Result_R = @R
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '> 4'
   Return
  End
-- if ( A > L And A < R And B > L And B > R )  Return AR;
  if ( @A > @L And @A < @R And @B > @L And @B > @R )
  Begin
   Select @Result_L = @A
   Select @Result_R = @R
   Select @Result_LR = DATEDIFF(day, @Result_L, @Result_R)
Print '> 5'
   Return
  End
 End
End

 

GO

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.