2015-11-05 74 views
0
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月份的记录。错误的月份

你知道为什么会发生这种情况。

+1

不要比较字符串,比较日期! – jarlh

+0

@jarlh没有得到你可以请解释或任何相同的例子。 –

+0

在17-10-2015和23-10-2015之间会返回,比如22-09-2015,因为它们只是字符串,而22在17和23之间 – colmde

回答

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' 
+0

感谢它工作正常 –

0

那么它会做,如果你将日期转换为字符串。您的查询在'17-10-2015'和'23-10-2015'之间按字母顺序查找任何内容。例如,这将包括'18 -09-2015'。

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上的索引。

+0

出现错误从字符串转换日期和/或时间时转换失败。 –

+0

嗯,有一种情况是SQL Server的国际化设置搞乱了YYYY-MM-DD格式。 SQL Server中的通用格式是YYYYMMDD(不带连字符),因此您可以尝试'BETWEEN'20151017'和'20151023''。 (我更喜欢连字符,因为它们是ISO标准并且易于阅读。) –