2011-05-17 41 views
4

我有以下幾列臨時表 -SQL - 比較行,而不cusors

id    int identity(1,1) NOT NULL 
startDate  dateteime   NOT NULL 
endDate   dateteime 
amount   decimal(18,8)  NOT NULL 

我需要運行一個查詢,這樣我得到柱量回的一個值。

  • 如果最大。 startDate是< =今天,那麼對應的行數。
  • if min。 startDate是> = today,那麼該行對應的金額。
  • 如果我們有startDates小於,等於和大於今天的行,那麼最接近於< =今天的startDate的行應該是其量應該被選擇的行。如果最近的startDate(< =)到今天有一個endDate比今天更少,該行的選擇量,與startDate旁邊的前者。

感謝您的幫助。

回答

0

通讀您的問題,看起來您只想選擇startDate離當前最近的行。

我想這應該給你,如果不是,請進一步澄清你的要求。也許通過添加一些示例數據和預期的輸出。

Select Top 1 * 
From YourTable 
Where startDate = IsNull(
       (Select Max(startDate) from #t where startdate <= getdate()), 
        (Select Min(startDate) from #t where startdate >= getdate()) 
         ) 
+0

感謝巴里的答案,但有一個小小的思念。當最近的startDate to TODAY的endDate小於TODAY時,則下一行(如果存在的話)應該是一個。例如 - 如果今天是5/19,我有2行 - 一個是startDate 5/10和endDate 5/17,第二行是startDate 5/22,那麼它就是第二行。也許一個小的修復你的SQL會有所幫助。 – CocaCola 2011-05-19 13:38:20

3

您搜索最近的startDate。您只能訂購表格,然後限制結果集!檢查了這一點:

SET DATEFORMAT DMY 

DECLARE @t TABLE (
    id uniqueidentifier NOT NULL, 
    startDate datetime NOT NULL, 
    endDate datetime, 
    amount decimal(18,8) NOT NULL) 

INSERT INTO @t (id, startDate, endDate, amount) 
    VALUES(NEWID(), '01.01.2009', NULL, 1.221) 
INSERT INTO @t (id, startDate, endDate, amount) 
    VALUES(NEWID(), '01.03.2009', NULL, 1.221) 
INSERT INTO @t (id, startDate, endDate, amount) 
    VALUES(NEWID(), '01.10.2011', NULL, 1.22) 
INSERT INTO @t (id, startDate, endDate, amount) 
    VALUES(NEWID(), '21.04.2011', NULL, 221) 
INSERT INTO @t (id, startDate, endDate, amount) 
    VALUES(NEWID(), '11.06.2011', NULL, 199221) 
INSERT INTO @t (id, startDate, endDate, amount) 
    VALUES(NEWID(), '01.01.2009', NULL, 1221) 

SELECT TOP 1 * FROM @t 
ORDER BY ABS(DATEDIFF(day, startDate, GETDATE())) 
+0

感謝Benjamin,但是當我用您的數據運行您的查詢時,它向我展示了startDate爲2011年6月11日的行,應該是2011年4月21日,這是離今天最近的日期(2011年5月19日) 。如果與startDate 4/21的trow結束日期比2011年5月15日的時間少,那麼2011年6月11日應該是正確的答案。 – CocaCola 2011-05-19 13:44:41

+0

mh,但在六月十一日和今天(五月19.)之間只有23天,在四月二十一日到今天(五月19.)之間有28天。額外的endDate邏輯如何工作?在我看來endDate null =「未來打開」endDate。 – benwasd 2011-05-19 18:06:49