SELECT TOP 1000 [pk_Id]
,[fk_resumeID]
,[fk_LoginID]
,[fk_CompanyId]
,Convert(nvarchar(11),ViewDate,105)
FROM [RecruitingDB].[Recruiting].[tbl_ViewResumeStatus]
where Convert(nvarchar(10),ViewDate,106)
between Convert(nvarchar(10),'17-10-2015',106) and Convert(nvarchar(10),'23-10-2015',106)
我正在使用上面的sql获取仅10月记录,但我正在获得9月记录。
你知道为什么会这样吗。
答案 0 :(得分:2)
您正在比较字母值。处理数字或日期值时应避免这种情况。
示例17-10-2015
无意中介于16-01-2015
和18-01-2015
请改用:
SELECT TOP 1000 [pk_Id]
,[fk_resumeID]
,[fk_LoginID]
,[fk_CompanyId]
,Convert(char(10),ViewDate,105)
FROM [RecruitingDB].[Recruiting].[tbl_ViewResumeStatus]
WHERE
ViewDate > '2015-10-17' and
ViewDate < dateadd(d, 1, '2015-10-23')
如果ViewDate是日期,您可以将 WHERE 子句替换为:
WHERE
ViewDate BETWEEN '2015-10-17' and '2015-10-23'
答案 1 :(得分:0)
如果您将日期转换为字符串,它会发生。您的查询在&#39; 17-10-2015&#39;之间按字母顺序查找任何内容。和&#39; 23-10-2015&#39;。例如,包括&#39; 18-09-2015&#39;。
答案 2 :(得分:0)
不要使用字符串进行日期算术。如果由于某种原因你拥有,那么使用YYYY-MM-DD格式:
SELECT TOP 1000 [pk_Id], [fk_resumeID], [fk_LoginID], [fk_CompanyId],
Convert(nvarchar(11),ViewDate,105)
FROM [RecruitingDB].[Recruiting].[tbl_ViewResumeStatus]
WHERE ViewDate >= '2015-10-17' AND ViewDate < '2015-10-24';
另外,请注意比较的使用。 BETWEEN
可能很危险,因为该列可能有一个时间组件。无论列是否具有时间组件,此方法都有效。并且,它将利用ViewDate
上的索引。
以下在SQL Server中也可以接受:
SELECT TOP 1000 [pk_Id], [fk_resumeID], [fk_LoginID], [fk_CompanyId],
Convert(nvarchar(11),ViewDate,105)
FROM [RecruitingDB].[Recruiting].[tbl_ViewResumeStatus]
WHERE CAST(ViewDate as date) BETWEEN '2015-10-17' AND '2015-10-23';
转换为日期删除时间组件。并且,函数调用是可以调用的,这意味着查询仍然可以使用ViewDate
上的索引。