2015-11-05 73 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標準並且易於閱讀。) –