我的疑问:
SELECT USERINFO.USERID [User ID], USERINFO.BADGENUMBER [Employee No.],
USERINFO.NAME [Name] FROM USERINFO where CHECKTIME='2014-09-08'
当我写上面的查询时,它不会返回checktime ='2014-09-08'
的值but when i write checktime>='2014-09-08' then it will give
me the output of 2014-09-08 and 2014-09-09
但我只想输出checktime='2014-09-08
我的检查时间归档包含以下数据:
checktime
2014-09-08 09:19:34.000
2014-09-08 11:19:34.000
2014-09-09 09:19:34.000
2014-09-09 10:19:34.000
那我怎样才能得到checktime ='2014-09-08'的输出?
答案 0 :(得分:1)
您的问题是可能包含2014-09-08 09:19:34.000
之类的值的字段与2014-09-08
之间的值相等。这些绝不是平等的。没有时间是指定日期的午夜,因此2014-09-08
等于2014-09-08 00:00:00.000
。
您需要一种从日期时间字段中删除时间部分的方法。
SELECT USERINFO.USERID [User ID],
USERINFO.BADGENUMBER [Employee No.],
USERINFO.NAME [Name]
FROM USERINFO
WHERE CONVERT(DATETIME,CONVERT(VARCHAR,CHECKTIME,112))='2014-09-08'
我认为在SQL Server 2008R2(可能在2008年工作)及以上版本中你可以使用:
SELECT USERINFO.USERID [User ID],
USERINFO.BADGENUMBER [Employee No.],
USERINFO.NAME [Name]
FROM USERINFO
WHERE CONVERT(DATE,CHECKTIME)='2014-09-08'
这是两个案例的 Fiddle 。
以上情况会转换表格中的字段,因此您可能希望使用>=
和<
来提升您的查询效果。你可以写一点,但你只会做一次,虽然每次运行时SQL都会转换。因此,下面的解决方案可能更合适:
DECLARE @DateFrom AS DATETIME
DECLARE @DateTo AS DATETIME
SET @DateFrom = '20140908'
SET @DateTo = DATEADD(day,1,@DateFrom)
SELECT USERINFO.USERID [User ID],
USERINFO.BADGENUMBER [Employee No.],
USERINFO.NAME [Name]
FROM USERINFO
WHERE CHECKTIME >= @DateFrom
AND CHECKTIME < @DateTo
答案 1 :(得分:1)
它的发生是因为你在比较不平等的价值观。在这里,您将与 2014-09-08 00:00:00.000 合作 2014-09-08 09:19:34.000
所以这就是reasoon,当使用相等运算符时,它不返回任何东西。
因此,您需要从日期时间中删除时间部分。这可以按如下方式完成:
SELECT USERINFO.USERID [User ID], USERINFO.BADGENUMBER [Employee No],USERINFO.NAME [Name]
FROM USERINFO
WHERE CONVERT(DATETIME,CONVERT(VARCHAR,CHECKTIME,112))='2014-09-08'
转换为varchar()时需要指定一个选项。有关详细信息,请参阅this文章。
答案 2 :(得分:1)
问题是你的数据库中有一个日期时间值,时间部分不同于&#34; 00:00&#34;。
您需要做的是摆脱db值的时间部分,以便将其与提供的日期进行比较。
没有直接的方法可以做到,但你可以: