【问题标题】:SELECT min date for a varchar column选择 varchar 列的最小日期
【发布时间】:2011-11-24 17:14:06
【问题描述】:

我的表的日期列是 VARCHAR 而不是日期时间。

例如

entry
'03/01/2011'
'03/22/2011'
'05/22/2010'

当我做一个

SELECT min(entry) FROM table

我会得到“03/01/2011”,因为它是按字母顺序排列的最小值。我想检索 '05/22/2010' 而不是最小日期。如何将列转换为日期时间并获取最小值。

谢谢

【问题讨论】:

  • 尽管给出了答案,但它会起作用 - 这就是为什么你不将日期存储在 varchar 列中!

标签: sql sql-server


【解决方案1】:

假设所有条目都“可转换”为datetime

SELECT MIN(CAST(entry as datetime))
FROM table

假设在某些情况下entry 不是datetime

SELECT MIN(CAST(ISNULL(NULLIF(ISDATE([entry]),0),'31/12/9999') as datetime))
FROM table

如果所有记录都是日期列,正如@Steve Wellens 建议的那样,我会将日期类型更改为datetime 字段以保存将来的问题

【讨论】:

    【解决方案2】:

    我会修复您的数据库架构。将列类型更改为日期时间。否则你将永远有问题。

    【讨论】:

    • +1 此外,如果您有 SQL 2008 或更高版本,请使用日期而不是日期时间。由于您不存储时间数据,因此您将在逻辑和物理磁盘空间上每行节省 5 个字节。
    • -1 表示不回答问题,因为在提问者的环境中可能无法回答
    • 根据标签,环境是SQL Server。也许您的意思是要求不允许。很公平。然而,该建议不仅解决了当前的问题,而且可能在未来阻止更多问题。有建设性的建议是件好事。
    【解决方案3】:

    当然,使用CAST or CONVERT 将您的varchar 变成date(或datetime)。

    【讨论】:

      【解决方案4】:

      试试CAST吧。

      SELECT min(CAST(entry AS DATETIME)) FROM table
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        • 1970-01-01
        • 2014-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多