的SQL Server 2008 R2 - 选择案例当日期之间日期

问题描述:

我有一个表像这样:的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

这应该做的工作

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