在进行datetime比较时如何处理空值?

llycmphe  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(318)

我的目标是计算出有多少帐户在我的网站在特定的时间。我允许帐户在任何时候被取消,但如果他们被取消后的一个月,我看,然后我仍然希望他们出现,因为他们是活跃的快照时间。
我的 accounts 如下所示的表:

  1. --------------------------------------------------
  2. id | int
  3. signUpDate | varchar
  4. cancellationTriggeredDate | datetime (NULLABLE)
  5. --------------------------------------------------

我写了一个select语句来实现这个目标,它看起来像:

  1. SELECT
  2. COUNT(*) AS January_2020
  3. FROM
  4. Accounts
  5. WHERE
  6. STR_TO_DATE(signUpDate, '%d/%m/%Y') <= STR_TO_DATE('31/01/2020', '%d/%m/%Y')
  7. AND cancellationTriggeredDate <= '2020-01-31 00:00:00'

预期结果将是3,这是多少帐户,我在一月份,并没有被取消后,一月。实际结果为0。我相信这是因为不是我所有的帐户都有一个取消日期,但我不知道如何处理这个。
为了更容易获得帮助,我创建了一个包含示例数据和模式的sql fiddle。
http://sqlfiddle.com/#!9/64f3e3层

798qvoo8

798qvoo81#

您的日期比较必须与取消日期相符。
那你可以用 OR 处理 NULL :

  1. SELECT COUNT(*) AS January_2020
  2. FROM Accounts
  3. WHERE STR_TO_DATE(signUpDate, '%d/%m/%Y') <= '2020-01-31' and
  4. (cancellationTriggeredDate > '2020-01-31' OR
  5. cancellationTriggeredDate IS NULL
  6. )

这是小提琴。请注意,上面给出了在每个2020-01-31 00:00:00(也就是在一天开始时)处于活动状态的用户。你可能有不同的意思:
客户活动时间正好是2020-01-31 00:00:00
客户活动时间正好是2020-02-01 00:00:00
2020-01-31全天活跃的客户
整个2020-01月的活跃客户
在2020-01月期间的任何时候都活跃的客户
所有这些使用基本相同的逻辑,只是通过调整具体的比较。

展开查看全部
8i9zcol2

8i9zcol22#

替代解决方案-您可以使用 CASE WHEN 并初始化 cancellationTriggeredDate 在这个领域进行比较之前,有一个假设的更高的日期(即本世纪末) WHERE 谓语。

  1. SELECT
  2. COUNT(*) AS January_2020
  3. FROM
  4. Accounts
  5. WHERE
  6. STR_TO_DATE(signUpDate, '%d/%m/%Y') <= STR_TO_DATE('31/01/2020', '%d/%m/%Y')
  7. AND CASE WHEN cancellationTriggeredDate IS NULL THEN '2099-12-31' ELSE cancellationTriggeredDate END > '2020-01-31 00:00:00'

相关问题