【问题标题】:SQL: Counting dates formatted as varcharSQL:计算格式化为 varchar 的日期
【发布时间】:2012-02-14 18:12:18
【问题描述】:

任务:

我需要计算 2011 年 7 月 1 日之后添加的表中的每条记录。

信息:

“Date_added”表中有一个列,格式为 varchar,包含格式为 mm/dd/yyyy 的日期。

我的尝试:

我尝试了以下查询:

SELECT count(date_added) FROM Abatements_Doc WHERE date_added >= '07/01/2011'

不幸的是,无论年份或日期如何,它都会计算月份大于 07 的任何日期。我不知道应该如何格式化我的查询以使其正确读取日期而不是通过 ascii 排序。在我的研究中,我发现了 CAST 和 CONVERT 选项,但不确定如何使用它们,或者如果有的话我应该使用哪一个。我对 SQL 非常陌生,并且想确保我不会弄乱表中的数据。我只需要得到上面指定的计数,而不以任何方式更改表中的数据。非常感谢这方面的任何帮助。提前致谢。

【问题讨论】:

  • 为什么将日期存储为 varchar? stackoverflow.com/a/4759039/284240
  • 该数据库是我们从供应商处购买的 Web 应用程序的一部分。我整个上午都在为同一个问题诅咒他们。

标签: sql sql-server-2008


【解决方案1】:

我没有测试。但是尝试转换语句。

SELECT count(date_added) 
FROM Abatements_Doc 
WHERE convert(datetime,date_added,1) >= convert(datetime,'07/01/2011',1)

【讨论】:

    【解决方案2】:

    (1) 不要使用mm/dd/yyyy 作为您的日期格式。使用安全且明确的格式;我唯一信任DATETIME/SMALLDATETIME 的是YYYYMMDD

    (2) 根据所需的精度将表中的数据类型更改为DATETIME/SMALLDATETIME/DATE。然后 `WHERE date_added >= '20110701' 就可以正常工作(如果存在该列,将使用该列上的索引)。

    (3) 如果您不能更改数据类型,那么以下内容也可以正常工作(尽管不会使用索引):

    WHERE CONVERT(DATETIME, date_added, 101) >= '20110701'
    

    【讨论】:

      【解决方案3】:

      无法比较 Varchar,请尝试将您的列更改为日期类型。

      【讨论】:

      • 好吧,学究起来,varchar 是可以比较的,只是日期以这种格式存储就无法准确比较。
      【解决方案4】:

      date_added 列值和您的目标日期都转换为 DATETIME 并进行比较;如:

      SELECT COUNT(1)
      FROM Abatements_Doc
      WHERE (CONVERT(datetime, date_added, 101)) >= CONVERT('07/01/2011', date_added, 101))
      

      【讨论】:

      • 您不需要转换右侧(即使语法经过测试并且正确)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多