我想要数据与日期字段的条件 - 比较两个日期丢弃时间部分

时间:2014-09-09 07:49:01

标签: sql sql-server sql-server-2008

我的疑问:

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'的输出?

3 个答案:

答案 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值的时间部分,以便将其与提供的日期进行比较。

没有直接的方法可以做到,但你可以:

  • 将两个日期转换为仅包含yyyy-mm-dd部分的文本格式CAST AND CONVERT
  • 使用函数提取日期的y,m,d部分并进行比较DATEPART
  • 将两个日期转换为整数,并比较这些值(SQL Server以浮点数格式存储日期,其中整数部分是自参考日期以来的天数,小数部分代表hh:mm: ss等)CAST AND CONVERT
  • 验证DB数据是否>> =提供的日期,并且&lt;比提供的数据加上一天,用DATEADD
  • 计算