【问题标题】:Apply date filter on VARCHAR | SQL对 VARCHAR 应用日期过滤器 | SQL
【发布时间】:2021-12-24 14:41:00
【问题描述】:

我对现有数据库有疑问。

我有一个数据库结构,其中“日期列”位于 VARCHAR(10) 中,我想对此应用日期过滤器,但由于日期保存为字符串,因此它不是正常工作。 由于某些系统限制,我无法更改数据库的结构或其中的日期格式,它必须保持原样。

立柱结构如下

`Date` varchar(10) DEFAULT NULL

日期格式(字符串)类似于 --> '10/22/2020'

我试过的查询如下,但没有用。

SELECT *
FROM `documents2` WHERE  documents2.Date >= '11/15/2019' AND documents2.Date <= '11/15/2021'

如果有人能告诉我一种可以在字符串上应用日期过滤器的方法,我将不胜感激。

【问题讨论】:

  • Edit 问题并标记您正在使用的 DBMS。
  • 您必须使用 DBMS 的转换功能来即时创建真实日期。
  • 存储在 VARCHAR 中的日期并不是数据完整性的最佳选择。请参阅此答案:stackoverflow.com/a/30569396/8328420 它可以解决您的问题,还可以告诉您如何修复列的类型以完全避免这种情况。
  • 将日期存储为字符串(不是日期,只是字符串)对于您可能希望执行的任何过滤标准的性能都非常不利;要执行任何日期比较,数据库引擎必须首先将字符串值转换为正确的日期,因此它必须对每一行 first 执行此操作 - 这就是所谓的 unsargable并且任何这样做的查询都会强制引擎扫描整个表/索引。
  • 从不,将日期值存储在 varchar 列中。这是一个非常糟糕的主意。

标签: sql


【解决方案1】:

你必须使用 str_to_date 函数。 以这样的方式:

SELECT *
FROM `documents2` WHERE  STR_TO_DATE(documents2.Date,'%m/%d/%Y') >= STR_TO_DATE('11/15/2019','%m/%d/%Y') AND STR_TO_DATE(documents2.Date,'%m/%d/%Y') <= STR_TO_DATE('11/15/2021','%m/%d/%Y')

【讨论】:

  • 谢谢伙计,这对我有用。
猜你喜欢
  • 2013-04-17
  • 2014-12-21
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多