当前位置: 首页 > 知识库问答 >
问题:

在执行日期时间比较时,如何处理空值?

尹俊贤
2023-03-14

我的目标是计算出在特定时间我的网站上有多少账户。 我允许帐户在任何时候被取消,但如果他们在我查看的月份之后被取消,那么我仍然希望他们在快照上显示为活动状态。

我的帐户表,如下所示:

   --------------------------------------------------
        id                         | int
        signUpDate                 | varchar
        cancellationTriggeredDate  | datetime (NULLABLE)
   --------------------------------------------------

我编写了一个select语句来完成这个目标,如下所示:

SELECT
    COUNT(*) AS January_2020
FROM
    Accounts
WHERE
    STR_TO_DATE(signUpDate, '%d/%m/%Y') <= STR_TO_DATE('31/01/2020', '%d/%m/%Y')
    AND cancellationTriggeredDate <= '2020-01-31 00:00:00'

预期的结果将是3,这是我有多少帐户在一月份,并没有被取消后一月。 实际结果为0。 我相信这是因为不是所有我的帐户都有注销日期设置,但我不确定如何处理这件事。

为了更容易获得帮助,我创建了一个包含示例数据和模式的SQL Fiddle。

http://sqlfiddle.com/#!9/64 F3E3

共有2个答案

凌昕
2023-03-14

替代解决方案-您可以在where谓词中使用case when,并使用假设较高的日期(即本世纪末)初始化CancellationTriggeredDate,然后在Where谓词中使用该字段进行比较。

SELECT
    COUNT(*) AS January_2020
FROM
    Accounts
WHERE
    STR_TO_DATE(signUpDate, '%d/%m/%Y') <= STR_TO_DATE('31/01/2020', '%d/%m/%Y')
    AND CASE WHEN cancellationTriggeredDate IS NULL THEN '2099-12-31' ELSE cancellationTriggeredDate END  > '2020-01-31 00:00:00'
丁和歌
2023-03-14

您的日期比较需要正确的取消日期。

然后可以使用处理null:

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

这是db<;>小提琴。 请注意,上面给出的是在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月份的任何时间活动的客户

所有这些都使用基本相同的逻辑,只是通过调整具体的比较。

 类似资料:
  • 问题内容: 在Go中进行日期比较是否有任何选择?我必须根据日期和时间- 独立地对数据进行排序。因此,我可以允许一个对象在一定日期范围内发生,只要它也在一定时间范围内出现即可。在此模型中,我不能简单地选择最旧的日期,最年轻的时间/最新的日期,最新的时间和Unix()秒来比较它们。我真的很感谢任何建议。 最终,我编写了一个时间解析字符串比较模块,以检查时间是否在范围内。然而,这并不顺利。我有一些大问题

  • 问题内容: 这是我正在尝试执行的一些代码片段: 我似乎无法比较日期和日期时间值。比较这些的最佳方法是什么?我应该将日期时间转换为日期还是相反?我如何在它们之间转换。 (一个小问题,但似乎有点令人困惑。) 问题答案: 使用该方法将日期时间转换为日期: 或者,您可以使用代替。你可以用 消除之后的时间部分。

  • 问题内容: 我尝试通过C#的JSON解析创建标记。我在javascript中有一个关于日期时间比较的小问题。 否则不起作用!谷歌地图上有truckOnline标记。我的错误在哪里? 和在SQL中这样的LastRecordTime格式:04.12.2013 01:03:00 问题答案: 穆罕默德 看来您打错了字: 应该是(请注意逗号): 另外,您试图从日期对象创建新的日期对象,这是不正确的: 这里是

  • 问题内容: 我正在使用moment.js格式化我的日期时间,这里有两个日期值,当一个日期大于另一个日期时,我想实现一种特定的功能。我阅读了他们的大多数文档,但没有找到实现此目的的功能。我知道会在那里。 这是我的代码: 编辑 在这里,我正在比较两个日期,即,期望第一个日期大于第二个日期,但是它总是转到else条件。不知道为什么 问题答案: 我相信你正在寻找的查询功能,,,和。 但是要确切地说出您要尝

  • 我正在使用moment.js格式化我的日期时间,这里我有两个日期值,当一个日期大于另一个时,我想实现一个特定的函数。我读了他们的大部分文档,但没有找到实现这一点的函数。我知道它会在那里。 这是我的代码: 编辑 在这里,我比较了两个日期,即,希望第一个日期大于第二个日期,但它总是转到else条件。我不知道为什么?

  • 我有个约会‘2019-05-08t 22:15:00-0400’。我想将这个日期与当前的日期和时间进行比较。如果上述日期和时间小于当前日期和时间,那么我必须做些什么。 我的代码是:- 但它返回 false 。

  • 问题内容: 我有 以下格式的两个对象。 现在,我想将上述两个日期与时间进行比较。我应该如何在Java中进行比较。 谢谢 问题答案: 自实现以来,它很容易: 按照合同规定,如果分别被认为小于/等于/大于/大于(例如,在此之前/之前/之后),它将返回一个负整数/零/正整数。 请注意,还有和方法将改为返回布尔值。

  • 问题内容: 如何在Java中比较没有时间的日期? 此代码比较时间和日期! 问题答案: 尝试比较将时间更改为00:00:00的日期(使用此功能):