我有一个包含员工信息和程序的数据库,该程序应该从该数据库中检索数据。
数据库结构如下所示:
ID | Date | signedIn | SignedOut
1 01-10-2012 08:00:00 16:00:00
1 14-10-2012 08:00:00 16:00:00
1 13-09-2012 08:00:00 16:00:00
当我尝试在01-10-2012
和15-10-2012
之间检索数据时,我只想获取前两行。所以我总共工作了16小时。
但是现在我的总金额为24,因为它也检索了最后一个,即使是从上个月开始
sql语句:
SELECT Info.UserID, Info.SurName, Info.FirstName, timetabel.Date,
FROM Info
INNER JOIN timestabel
ON Info.UserID = Bruger_tidstabel.UserID
WHERE Info.UserID = '1'
AND timetabel.Date >= '01-10-2012'
AND timetabel.Date <= '14-10-2012'"
这句话有效,所以它可以从数据库中检索数据。
有没有办法告诉数据库,我正在使用日期,所以它只会检测两个日期之间的数据?
答案 0 :(得分:1)
尝试使用BETWEEN语句,例如:
"... WHERE Info.UserID = '1' AND (timetabel.Date BETWEEN '01-10-2012' AND '14-10-2012')"
检查是否有().. 还要检查日期模式是否正确,具体取决于您的数据库。
答案 1 :(得分:0)
您可以使用BETWEEN
运算符,它在WHERE子句中用于选择两个值之间的数据范围。
SELECT column_name(s)
FROM table_name
WHERE column_name
BETWEEN value1 AND value2
您的表格字段Date
最好采用日期或时间戳格式。此外,年份在日期格式前面,如下所示:
SELECT Info.UserID, Info.SurName, Info.FirstName, timetabel.Date, FROM Info INNER JOIN timestabel ON Info.UserID = Bruger_tidstabel.UserID WHERE Info.UserID = '1' AND timetabel.Date BETWEEN '2012-10-01' AND '2012-10-14'
答案 2 :(得分:0)
在将日期表示为字符串时,您始终需要小心,因为正如Christian所说,它们并不总是按预期处理。确保使用日期时间类型或使用其中一个日期函数(DATEADD,DATEDIFF等),以便将日期与日期进行比较! 不幸的是,SQL通常会运行而不会出现错误,但它从SQL中解释的并不总是如预期的那样!
答案 3 :(得分:0)
虽然没有直接回答你的问题(其他已经回答),但我想在处理日期范围时警告你一个常见的陷阱。
timetabel.Date <= '14-10-2012'
如果timetabel.Date
中存储的日期/时间是14-10-2012 08:30
会怎样?该日期将被排除在外。我个人更喜欢使用这种更安全的测试
timetabel.Date < '15-10-2012'
这相当于上面的一个(除了原因的时间部分)。所以不要比较
table.column <= date
我比较
table.column < (date + one day)