我想限制我的查询日期,但是当我使用带有“Between”的 Substr 命令时,日期不能按照我的要求进行限制。
例如;
Select *
from data
Where SUBSTR(DATE,1,10) BETWEEN '01/01/2024' AND '31/08/2024';
我写了这样的代码,但是“Between”命令不起作用,并且代码为我提供了全天的数据。
我该如何解决这个问题?
由于我的 SQL 知识有限,实际上我无法尝试任何东西。
您需要实际日期值。否则,您将进行简单的字符串比较,其中以 1 或 2 开头的任何内容都将位于这些“日期”字符串之间,无论您还有其他什么。
具体是什么样子取决于您拥有什么样的数据库,因为几乎没有数据库遵循日期函数的确切 ansi 规则;他们都是不同的。我将提供有关 SQL Server 的建议。如果您使用不同的数据库,那么...玩愚蠢的游戏,赢得愚蠢的奖品。下次告诉我们你有什么。
对于 SQL Server,答案因
Date
列而异。如果该列已经是 DateTime
值,则您根本不应该考虑字符串。截断到 10 个字符可能是解决此问题的最糟糕的方法。相反,您想要更像这样的东西:
WHERE DATE >= '20240101' AND DATE < '20240901'
注意我如何格式化文字。由于历史原因,SQL Server 对此可能很挑剔。其他格式“似乎”可以工作,而且确实在大多数情况下都可以工作,但这是“唯一”格式,它“永远不会”让您因意外的数据解释而陷入困境。您可能使用的其他所有东西都有边缘情况,可能会产生奇怪的结果。 此外,请注意我如何构建范围和两个单独的条件表达式,其中上限是独占,而不是日后的
包含比较。这称为“半开放”日期比较,这是进行这些检查的最佳方法。
还要注意我不需要使用子字符串。完整的日期时间值对于此比较是安全的,并且会给出正确的结果。事实上,我根本不需要改变列;我们可以按原样使用存储的值。这非常重要,因为它确保列上的任何索引仍然有效。如果您需要执行诸如获取子字符串或转换为日期之类的操作,这将破坏该查询列的索引使用,这会切入数据库性能的核心。
另一方面,如果 Date
列是字符串 (varchar),您的第一直觉应该是
模式,因为将名为 DATE
的列设置为 string/varchar 类型确实是一个 broken架构。
但是,如果这超出了您的控制范围,您将需要使用
CAST()
或 CONVERT()
操作来首先获取日期值。然后你可以按照我之前展示的方式使用结果。