2013-06-25 45 views
1

執行此查詢後出現上述SQL錯誤。','附近的語法不正確(日期內不能正常工作)

SELECT r.SectionIDNum, r.PeopleIDNum, r.Completed, c.CourseID, s.DistrictIDNum, s.EndDate 
FROM Registration r, Course c, Section s 
WHERE r.SectionIDNum=s.SectionID AND c.CourseID=s.CourseIDNum AND r.Completed='Y' 
AND s.EndDate between ('2012-06-31', 'yyyy-mm-dd') and ('2013-07-01', 'yyyy-mm-dd') 

顯然,在日期中的逗號造成的錯誤,但我不知道如何解決它。

+4

你正在使用哪些DBMS? –

+2

通常'('2012-06-31','yyyy-mm-dd')'用於日期轉換的上下文中。所以你在這裏錯過了函數名。例如。對於Oracle數據庫管理系統,正確的方法應該是'to_date('2012-06-31','yyyy-mm-dd')' – PerfectPixel

+0

@StefanSteinegger:SQL Server 2008 R2 – Esther

回答

0

使用CAST()函數(CAST轉換一種數據類型的不同類型的值,在這種情況下,CHAR到DATETIME):

SELECT r.SectionIDNum 
     ,r.PeopleIDNum 
     ,r.Completed 
     ,c.CourseID 
     ,s.DistrictIDNum 
     ,s.EndDate 
FROM Registration r 
     ,Course c 
     ,Section s 
WHERE r.SectionIDNum=s.SectionID 
    AND c.CourseID=s.CourseIDNum 
    AND r.Completed='Y' 
    AND s.EndDate BETWEEN CAST('20120630' AS DATETIME) 
     AND CAST('20130701'AS DATETIME) 

您還可以使用:

CONVERT(DATETIME,'20130701') 
+0

錯誤現在說'TO_DATE不是一個公認的內置函數名稱.'我想這是Oracle數據庫管理系統的補丁? – Esther

+0

@Esther我假設你正在使用基於你的例子的Oracle。我已經更新了SQL SERVER的答案 – Zzz

+0

非常感謝!我使用了你的更新代碼,但現在它說'varchar數據類型轉換爲日期時間數據類型導致超出範圍的值。「你能幫忙嗎? – Esther

1

六月只有30天。因此,SQL Server會因您的請求而將6月31日作爲日期進行投票而感到困惑。

這工作得很好:

SELECT CAST('2012-06-30' AS DATE) 

的一種方式,以避免每月的問題到底是在你的榜樣使用DATEADD()功能,例如,得到一個一年零一天2013 7月1日之前,像:

SELECT DATEADD(day,-1,(DATEADD(year,-1,CAST('2013-07-01' AS DATE)))) 

此外,請記住BETWEEN是包容的,所以你要6月30日和7月1日在你的榜樣,也許只是減去一年就足夠了。

+0

你說得對。感謝您指出「BETWEEN」是包容性的,因爲我不知道這一點。 – Esther