【问题标题】:Date comparison in varchar formatvarchar 格式的日期比较
【发布时间】:2016-09-08 08:04:16
【问题描述】:
IF('08/30/2015'>'08/29/2016')
SELECT '1'
ELSE
SELECT '0'

此 SQL 语句返回 1,因为它只比较月份和日期而忽略年份。我知道我在比较两个 varchar 值——不是日期——但我想知道这个比较遵循什么逻辑 SQL?

有人可以帮帮我吗?同样的场景给了我一个项目中的问题,我通过转换到日期来解决这个问题。但是,我想知道这背后的逻辑。我搜索了它,但没有找到正确的解释。

【问题讨论】:

  • 它自然地将它们作为字符串进行比较。它逐个字符地比较它们,第一个不同的是 3 与 2,3 大于 2,因此结果为 1。

标签: sql sql-server


【解决方案1】:

您的值不是日期。它们是字符串。你可以这样做:

IF (convert(date, '08/30/2015') > convert(date, '08/29/2016'))
    SELECT '1'
ELSE
    SELECT '0';

(注意:这是否有效可能取决于您对日期格式的国际化设置。我假设设置为理解 MDY 格式。)

但是为什么要麻烦呢?只需使用 ISO 标准日期格式 (YYYY-MM-DD):

IF ('2015-08-30' > '2015-08-29')
    SELECT '1'
ELSE
    SELECT '0';

这些不需要转换,因为字符串比较正确。

【讨论】:

    【解决方案2】:

    它比较两个字符串,所以即使人们会看到这些并想到日期,SQL 只会看到一个字符串大于另一个字符串。如果你去掉斜线,把数字放在那里,可能更有意义:08302015 > 08292016

    【讨论】:

    • 这行不通,因为它会按年的前一个月和前一天排序(即在您的示例中,2015 年并不真正大于 2016 年,是吗?)
    • @Ben 我不建议将此作为计算,而是回答他的问题,即在比较呈现的值时逻辑是如何工作的。他已经说过他通过强制转换得到了正确解析的日期,问题是为什么字符串会按照它们的方式计算。去掉斜线可能会让人类更清楚,这就是我试图传达的。也许你应该更仔细地阅读这个问题。
    • 糟糕。我的错。所以不允许我删除我的反对票。对此感到抱歉。
    • 不用担心。它发生了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多