2011-09-27 87 views
2
SELECT S.studentID, S.studentFName, S.DOB, S.studentEMail, S.studentAddress 
FROM Student AS S RIGHT OUTER JOIN 
(SELECT Attendance.studentID, COUNT(*) AS cnt FROM Attendance CROSS JOIN 
CourseUnit WHERE (Attendance.attStatus = 'Yes') AND (CourseUnit.courseCode = 'S3000') AND (CONVERT(VARCHAR, Attendance.attDate, 101) < '11/10/2010') GROUP BY Attendance.studentID 
HAVING (COUNT(*) < 5)) AS A ON A.studentID = S.studentID 

一切正常,除了attDate。我在2010年没有任何记录,它仍然带来了所有的?为什么不通过我的数据过滤日期.. smalldatetime

+1

你为什么把日期当作字符串? SQL Server知道如何比较日期,并且会明智地做到这一点。转换为字符串会打开各种错误的可能性。 –

+0

Attendance.attDate是什么数据类型? –

+0

CONVERT(VARCHAR,Attendance.attDate,101)为什么要转换为varchar – Nighil

回答

0

难道你不是说2010年给我的日子比这一天少吗(< '2/10/2010')?

也许你需要切换你的<>

+0

是的,但这只是一个测试,看它是否会带来任何结果。 – David

+0

我已更新我的代码 – David

+1

@David你究竟在做什么,它在干什么?向我们展示一些示例输出。你也可以尝试清理一下代码吗?到处都有额外的空白。 – Dave

1

让我猜 - 你的日期是一个varchar?被解雇。任何原因在于难看难看难看unperformant且容易出错的构建体

(CONVERT(VARCHAR,Attendance.attDate,101)< '11/10/2010' )

Attendance.attDate是一个日期对象,而不是从...开始?试试看看是否有效。

0

Attendance.attDate应该是数据类型datetime并且比较应该是Attendance.attDate < '20101110'(YYYYMMDD)如果您想要给定日期值之前的行。