【问题标题】:SQL Server 2008 R2 - Select Case When date between datesSQL Server 2008 R2 - 在日期之间选择大小写
【发布时间】:2014-10-09 09:51:17
【问题描述】:

我有一张这样的桌子:

---------------------------------------------------------------
| 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,请按原样告知此查询:

以下声明的日期介于 2014 年 9 月 29 日至 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,我做错了什么?在 SQL Server 2008 R2 中使用 DATE 之间的 DATE 时的情况是否正确?

PS:请注意,我不想将查询更改为具有 WHERE 条件。

提前感谢堆栈溢出家庭。

【问题讨论】:

  • (CreatedDate between CreatedDate and @dateEnd) 应该是(CreatedDate between @dateStart and @dateEnd),不是吗?
  • @MikhailTimofeev 我的错误纠正了它,最初它就像它返回 Null。
  • 当 transactionType != 7 并且(CreatedDate 不在 CreatedDate 和 @dateEnd 之间)时,您需要有 else 部分,您将获得 NULL 值!!!!
  • 我认为你必须使用 Paydate 列而不是 CreatedDate 列。我对吗?
  • @TMAN-MAN 您的案例在日期之间返回一个有效值,在日期之外没有任何内容(空)。您仍然可以获得所有行,只是带有空值。

标签: sql sql-server-2008-r2 case


【解决方案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。

然后,我在您的查询周围进行选择,以仅过滤未分配金额不为 NULL 的结果。 请注意,我选择 UserID 作为 MemberID,因为您在示例中使用了 UserID。

我用一个表对其进行了测试,其中 PayDate 是一个日期时间列。

正如你的一个 cmets 中已经提到的,我更喜欢简单的方法(而且它更快!):

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

【讨论】:

    猜你喜欢
    • 2013-09-08
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2016-11-29
    相关资源
    最近更新 更多