从[User]U中选择*
其中U.DateCreated='2014-02-07'
但在数据库中,用户是在2014-02-07 12:30:47.220创建的,而我只在
'2014-02-07'
它不显示任何数据
不要被诱惑去做这样的事情:
从[User]U中选择*,其中convert(varchar(10),U.DateCreated,120)='2014-02-07'
这是一个更好的方法:
从[User]U中选择*
其中U.DateCreated>;='2014-02-07'和美国日期创建<;日期添加(2014-02-07年1月1日)
看:“SARGable”这个词的真正含义是什么
编辑+
避免在where子句(或联接条件)中的数据上使用函数有两个基本原因
- 在大多数情况下,对数据使用函数进行筛选或联接会使优化器无法访问该字段上的索引,从而使查询速度变慢(或“成本更高”)
- 另一个是,对于涉及的每一行数据,至少要执行一次计算。这可能会向查询中添加数百、数千或数百万计算,以便我们可以与单个标准进行比较,如
2014-02-07
。相反,修改标准以适应数据更有效
“修改标准以适应数据”是我描述“使用SARGABLE
谓词”的方式
也不要在两者之间使用
日期和时间范围的最佳实践是避免介于和之间
始终使用以下表格:其中列>='20120101'和列<;'20120201'此表格适用于所有
类型和所有精度,无论时间部分是否为
适用
http://sqlmag.com/t-sql/t-sql-best-practices-part-2 (伊齐克·本·甘)