2014-10-09 150 views
0

我有一個表像這樣:的SQL Server 2008 R2 - 選擇案例當日期之間日期

--------------------------------------------------------------- 
| UserID | Amount | PayDate    |TransactionType| ... 
---------------------------------------------------------------- 
| 1  | 140  | 2014-09-30 22:00:00.000| 7   | 
| 2  | 230  | 2014-09-30 22:00:00.000| 7   | 
| 1  | 120  | 2014-08-01 22:00:00.000| 7   | 
| 2  | 135  | 2014-07-30 22:00:00.000| 7   | 
| 1  | 120  | 2014-09-30 22:00:00.000| 4   | 
---------------------------------------------------------------- 

我寫了下面的查詢,但它返回NULL,請在此查詢建議的是:

下面的日期宣佈29/09/2014和2014年1月10日之間

Declare 
    @dateStart datetime= CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETUTCDATE())+2),GETUTCDATE()),101), 
    @dateEnd datetime=(CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(GETUTCDATE())-1),GETUTCDATE()),101)) 

Select 
    MemberID, 
    case 
     when transactionType = 7 
      and (PayDate between @dateStart and @dateEnd) then Amount 
    End AS 'Outstanding Amount' 
from 
    MemberPayment 

我的輸出應該是:

| MemberID | OutStanding Amount| 
    --------------------------------- 
    | 1  | 140    | 
    | 2  | 230    | 

但查詢返回null,我做錯了什麼? CASE當DATE之間的DATE使用正確的SQL Server 2008 R2嗎?

PS:請注意我不希望將查詢更改爲具有WHERE條件。

預先感謝您的堆棧溢出家庭。

+2

'(CreatedDate和@dateEnd之間CreatedDate)'應該是'(間CreatedDate @dateStart和@dateEnd)',不是嗎? – 2014-10-09 09:53:28

+0

@MikhailTimofeev我的錯誤糾正了它,最初就像它的返回Null。 – 2014-10-09 09:57:56

+1

當transactionType!= 7和(CreatedDate不在CreatedDate和@dateEnd之間)時,您需要有其他部分becoz,您將獲得NULL值! – 2014-10-09 10:00:32

回答

1

這應該做的工作

Declare 
    @dateStart datetime= DATEADD(dd,-(DAY(GETUTCDATE())+2),GETUTCDATE()), 
    @dateEnd datetime=DATEADD(dd,-(DAY(GETUTCDATE())-1),GETUTCDATE()) 

    select MemberID, [Outstanding Amount] 
    from 
    (
Select 
    UserID as MemberID, 
    case 
     when transactionType = 7 
      and (PayDate between @dateStart and @dateEnd) then Amount 
    End AS 'Outstanding Amount' 
from 
    MemberPayment 
    ) As TmpQuery 

    where [Outstanding Amount] is not null 

我刪除的轉換來自您的變量轉換爲VARCHAR。

然後,我放了一個選擇你的查詢,過濾只是結果與Oustanding金額非NULL。 請注意,我選擇了UserID作爲MemberID,因爲你在你的例子中使用了UserID。

我用一個表測試它,其中PayDate是一個Datetime列。

正如已經在你的評論人提到我寧願簡單的方法(和它`快很多!):

Declare 
    @dateStart datetime= DATEADD(dd,-(DAY(GETUTCDATE())+2),GETUTCDATE()), 
    @dateEnd datetime=DATEADD(dd,-(DAY(GETUTCDATE())-1),GETUTCDATE()) 

    select UserID, Amount as [Outstanding Amount] 
    from MemberPayment 
    where TransactionType = '7' 
    and PayDate between @dateStart and @dateEnd 
相關問題