Select * from [User] U
where U.DateCreated = '2014-02-07'
但在数据库中创建用户上2014-02-07 12:30:47.220
,当我只放'2014-02-07'
它不显示任何数据
Answers:
不要试图做这样的事情:
Select * from [User] U where convert(varchar(10),U.DateCreated, 120) = '2014-02-07'
这是一个更好的方法:
Select * from [User] U
where U.DateCreated >= '2014-02-07' and U.DateCreated < dateadd(day,1,'2014-02-07')
编辑+有两个基本的原因可以避免在where子句(或联接条件)中对数据使用函数。
2014-02-07
。更改标准以适合数据的效率要高得多。“描述标准以适合数据”是我描述“使用SARGABLE
谓词”的方式
并且不要在两者之间使用。
日期和时间范围的最佳做法是避免使用BETWEEN,并始终使用以下形式:
col> ='20120101'和col <'20120201'不管时间部分是否适用,此表格均适用于所有类型和所有精度。
http://sqlmag.com/t-sql/t-sql-best-practices-part-2(Itzik Ben-Gan)
can
有时会进行补偿,使用可控谓词也是一个好习惯。
date literal
格式是“ YYYYMMDD”。数据类型:日期或日期时间或时间或日期时间2或smalldatetime都不具有全部格式,因为它们存储为数字。对于日期字面量'YYYY-MM-DD'并不完全安全,有一种语言环境设置会误解该序列为YYYY-DD-MM
如果您使用的是SQL Server 2008或更高版本,则可以使用date数据类型:
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2014-02-07'
应当注意,如果对日期列进行了索引,则该列仍将使用索引并且可以保存。这是日期和日期时间的特殊情况。
您可以看到SQL Server实际上将其转换为>和<子句:
我刚刚在一个大表上尝试过,按照@kobik的注释在date列上有一个二级索引,并且该索引仍在使用,对于使用BETWEEN或> =和<的示例而言,情况并非如此
SELECT *
FROM [User] U
WHERE CAST(U.DateCreated as DATE) = '2016-07-05'
AaronsBad
这些天数据库进展如何?
根据您的查询
Select * from [User] U where U.DateCreated = '2014-02-07'
SQL Server在比较确切的日期和时间,即(比较2014-02-07 12:30:47.220
具有2014-02-07 00:00:00.000
相等)。这就是为什么比较结果为假
因此,在比较日期时,您还需要考虑时间。您可以使用
Select * from [User] U where U.DateCreated BETWEEN '2014-02-07' AND '2014-02-08'
。
between
在两端都用等号(> =和<=)定义,例如select * from x where col_1 between 'A' and 'M'
包括A和M(当然加上B到L)。的包容性between
对于诸如文档索引之类的东西而言是极好的。但是对于日期/时间范围,这是一场灾难,因为它会产生重叠。我知道在两者之间使用看起来不错,但实际上SQL between
对于日期范围来说,just不能正常工作。始终使用> =和<的组合,如U.DateCreated >='2014-02-07' and U.DateCreated < '2014-02-08'
between
可以。您的建议,使用>=
和<
无疑是最好过between
的日期范围。我只想说比较日期时也应该考虑时间。
您可以使用LIKE
statement而不是=
。但是要使用DateStamp做到这一点,您CONVERT
首先需要将其添加到VARCHAR中:
SELECT *
FROM [User] U
WHERE CONVERT(VARCHAR, U.DateCreated, 120) LIKE '2014-02-07%'