SQL Server比较datetime字段

时间:2014-12-19 08:41:55

标签: sql-server datetime

我的表中有一个datetime字段,我需要在where子句中使用。 字段名是DatumAanname 在我的dataviewgrid中,它显示例如“16/12/2014 15:57:04”

我查看了微软的页面以及转换的所有日期时间选项,但这种格式似乎不在该页面上。 我能看到的最接近的格式是“16 12 2014 15:57:04”,应该是113

我尝试过像这样的查询

SELECT o.DatumAanname,
    (convert(DATETIME, '16 dec 2014 15:57:04:000', 113)),
    (convert(DATETIME, '16 dec 2014 15:57:04', 113)),
    (convert(DATETIME, o.DatumAanname, 113))
FROM vwOpdracht o

这将返回4个看起来完全相同的字段

但是当我做的时候

where (convert(datetime, o.DatumAanname, 113)) = (convert(datetime, '16 dec 2014 15:57:04:000', 113))

它返回0条记录

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

日期没有格式,它们是具有自己的二进制存储的本机类型。格式和转换仅在从/转换为字符串时适用,如果使用不兼容的排序规则和文化,它们经常会出现问题。

避免问题的最佳方法是简单地完全删除字符串:在表中使用日期类型的列,并使用参数化查询进行查询。实际上,如果日期作为文本存储在表格中,那么没有通用和防错的方法可以解决问题。

传递强类型值而不是字符串(例如,C#中的DateTime,T-SQL中的日期,日期时间,日期时间2)。例如:

where o.DatumAanname= @dateParam
如果值匹配,

将返回匹配的条目。

如果无法传递日期参数,则使用the unambiguous ISO8691 format,例如:

where o.DatumAanname = '2014-12-16T15:57:04'

如果您想传递仅限日期的值,您可以使用未分离的格式,这也是明确的

where o.DatumAanname = '20141216'

需要注意的一点是,日期值必须完全匹配,直到毫秒。通常,日期用于范围查询,这不是问题。但是在平等查询中,这可能是个问题。

您可以使用datetime2(0)作为字段类型来避免这种情况,这可以确保毫不存储毫秒数。

另一个选择是使用范围而不是相等查询,例如:

where o.DatumAanname between '2014-12-16T15:57:04' and '2014-12-16T15:57:04.999'

where o.DatumAanname between '2014-12-16T15:57:00' and '2014-12-16T15:57:59'

如果你想要分钟级精度