带有两个日期列的 sql 查询“where 子句”

Posted

技术标签:

【中文标题】带有两个日期列的 sql 查询“where 子句”【英文标题】:sql query "where clause" with two date columns 【发布时间】:2021-01-03 21:47:41 【问题描述】:

我有一个日期列和另一个日期列作为发票日期。 示例:

虽然在 Excel 中,我可以将 InvDate 列过滤到“01-12-20 之前”并将 DATE 列过滤到“上个月”然后它给我预期结果如下:

所以,我试过这样的 SQL:

SELECT DATE, InvDate FROM `MyTable` 
WHERE InvDate < '2020-12-01'
AND DATE >= '2020-12-01'
AND DATE <= '2020-12-31'

所以我认为第一个“地点”的意思是:所有发票日期在 2020 年 12 月 1 日之前, 第二个和第三个“地点”是指:2020 年 12 月内(2020 年 12 月 1 日至 2020 年 12 月 31 日之间)的所有付款日期,所以我认为结果将是所有发票日期(日期为任何月份但 2020 年 12 月之前) 2020 年 12 月付款,但结果如下所示:

表格列的 InvDate 和 DATE 都是日期格式。 我想知道如何执行 SQL。

任何形式的回应将不胜感激。 提前谢谢你。

This question should include more details and clarify the problem.

问题是我写的那个 SQL 不能得到预期的结果。 预期结果是在 2020 年 12 月付款的 2020 年 12 月之前获得发票日期。换句话说:“这是 12 月 20 日之前的发票日期在 12 月 20 日付款”

关于“更多细节”,我很抱歉,因为我不知道如何描述我的情况开始更详细。我应该提供数据库主机、用户名和密码吗?

【问题讨论】:

【参考方案1】:

您的结果表明,您的行的NULL 值基本上是invoicedate。如果该列的默认值是0,那么您将看到您所做的日期——或者该值是否被显式插入。这是example。

最新版本的 mysql 不允许将 '0000-00-00' 作为 date 值,除非您修改默认设置。

您可以通过回溯过去并将其添加到where 来过滤掉这些:

SELECT DATE, InvDate FROM `MyTable` 
WHERE InvDate < '2020-12-01' AND
      InvDate >= '1900-01-01' AND
      DATE >= '2020-12-01' AND
      DATE < '2021-01-01';

请注意,我在date 比较中切换了不等式。这样可以更轻松地切换到不同的月份——您不必记住该月的最后日期。

【讨论】:

嗨,戈登,谢谢您的回答。在 phpMyAdmin 中,Null 的这两个日期列的列结构设置为“No”,而 Default 的列结构设置为“None”。您的意思是我应该将其 Default 值更改为 "Null" 而不是 "None" 吗?此外,每个日期列中都没有空白行。 @karma 。 . .我建议将NULL 作为默认值。 我尝试了 NULL,然后我尝试了 NONE 作为 InvDate 默认值,并按照您的说明进行操作,但它没有给我任何结果(它只是显示标题)。 @karma 。 . .老实说,我对如何通过 phpadmin 执行此类操作并不是很熟悉。我只是使用数据库命令在数据库中设置了表。 没关系,戈登。再次感谢您的帮助。【参考方案2】:

看起来 0000-00-00 在 invdate 中被用来表示发票日期未知或不适用。

您可以添加: AND invdate '0000-00-00'

【讨论】:

您好 OwlsSleeping,谢谢您的回答。我已经尝试了您的建议,但很抱歉,它没有给我任何结果。

以上是关于带有两个日期列的 sql 查询“where 子句”的主要内容,如果未能解决你的问题,请参考以下文章

一个带有两个where子句的查询中的两个sql总和[重复]

带有WHERE子句逻辑的SQL Server存储过程

在子查询中为数据透视列的值实现 WHERE 子句?

如何在带有 select 语句的 where 子句中使用比较运算符?

SQL LEFT JOIN 与另一列的 where 子句

Sqoop导入具有带有where子句和并行处理的SQL查询