错误的一个月

时间:2015-11-05 11:43:34

标签: sql sql-server

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月记录。

你知道为什么会这样吗。

3 个答案:

答案 0 :(得分:2)

您正在比较字母值。处理数字或日期值时应避免这种情况。

示例17-10-2015无意中介于16-01-201518-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上的索引。