2010-02-01 56 views

回答

0

例如

CAST(CONVERT(VARCHAR(10), date, 120) AS DATETIME) 

请注意,这不会很好地利用日期字段上的任何索引,因此您可能会看到性能较差,尤其是对于较高的数据量。

替代将是:
- 重新评估你想实现什么和如何
- 字段的日期和时间元素存储在2个独立的,可转位的字段。

+0

我不希望更改@idate,但日期 – 2010-02-01 13:18:00

+0

只是更改@idate到目前为止,更新。请注意,这会阻止良好的索引使用 – AdaTheDev 2010-02-01 13:19:39

0

除非绝对必要,否则不应该更改列信息 - 这将导致全表扫描并忽略索引。只要确保@idate是正确的。

1

最好使用范围扫描。为什么你需要改变存储在列中的值?如果你想找到的是发生在2009-09-15(不分时间)的一切,你可以说:

WHERE [date] >= '20090915' 
AND [date] < '20090916'; 

现在你仍然可以在[日期]列使用索引,如果它存在,如果你经常这样运行查询,那么它应该是可以理解的。在左侧转换会导致非SARGable查询,这几乎会单方面地影响性能。

一个有用的链接检查出是蒂博尔的日期/时间数据类型的文章,包括查询提示:

http://www.karaszi.com/SQLServer/info_datetime.asp

我也写了一个漂亮的长篇文章在查询日期范围时避免不良做法:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx