Sql varchar格式的日期比较

Sql varchar格式的日期比较,sql,sql-server,Sql,Sql Server,此SQL语句返回1,因为它只比较月份和日期,而忽略年份。我知道我在比较两个varchar值,而不是日期,但我想知道SQL在这个比较中遵循什么逻辑 有人能帮我吗?同样的场景在一个项目中给了我一个问题,我通过迄今为止的转换解决了这个问题。然而,我想知道这背后的逻辑。我搜索了它,但没有找到正确的解释。它正在比较两个字符串,因此,即使人类会查看这些字符串并想到日期,SQL也只能看到一个字符串大于另一个字符串。如果你去掉斜杠,只把数字放在那里,可能会更有意义:08302015>08292016它比较两个字

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


有人能帮我吗?同样的场景在一个项目中给了我一个问题,我通过迄今为止的转换解决了这个问题。然而,我想知道这背后的逻辑。我搜索了它,但没有找到正确的解释。

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

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

你的值不是日期。它们是弦。你可以做:

IF('08/30/2015'>'08/29/2016')
SELECT '1'
ELSE
SELECT '0'
(注意:这是否起作用可能取决于日期格式的国际化设置。我假设这是为了理解MDY格式而设置的。)

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


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

您的值不是日期。它们是弦。你可以做:

IF('08/30/2015'>'08/29/2016')
SELECT '1'
ELSE
SELECT '0'
(注意:这是否起作用可能取决于日期格式的国际化设置。我假设这是为了理解MDY格式而设置的。)

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


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

这不起作用,因为它将在年前的月份和日期进行排序(即,在您的示例中,2015年实际上并不大于2016年,是吗?@Ben我不建议将此作为计算,而是在比较给出的值时回答他关于逻辑如何工作的问题。他已经说过,他通过施法获得了正确解析的日期,问题是为什么弦的计算方式是这样的。去掉斜线可能会让人更清楚,这正是我试图传达的。也许你应该更仔细地阅读这个问题。我的错。所以我不允许我取消我的否决票。对不起,别担心。发生这种情况:)这不起作用,因为它会在年前的一个月和一天进行排序(即,在你的例子中,2015年并不是真的大于2016年,是吗?@Ben我不是建议将其作为一种计算,而是回答了他关于在比较给出的值时逻辑如何工作的问题。他已经说过,他通过施法获得了正确解析的日期,问题是为什么弦的计算方式是这样的。去掉斜线可能会让人更清楚,这正是我试图传达的。也许你应该更仔细地阅读这个问题。我的错。所以我不允许我取消我的否决票。对不起,别担心。当然,它会将它们作为字符串进行比较。它一个字符一个字符地比较它们,第一个不同的是3与2,3大于2,因此结果是1。它自然地将它们作为字符串进行比较。它逐字符比较它们,第一个不同的是3与2,3大于2,因此结果是1。
IF ('2015-08-30' > '2015-08-29')
    SELECT '1'
ELSE
    SELECT '0';