我的表中有一个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条记录
我在这里做错了什么?
答案 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'
如果你想要分钟级精度