传递getdate()&时,Sql选择查询混淆它的价值在哪里

时间:2016-11-08 06:56:36

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

我有一个像下面这样的员工表

ID    Name     Mobile      Ondate                   Address
1     Ankit    1234567895  2016-11-08 10:10:04.540  abc
2     Amit     4521545258  2016-11-08 11:10:04.540  bcd
3     Amit2    7541258562  2016-11-08 12:10:04.540  gfd

现在我写下面的select查询,然后它给出了Employee表的所有记录

select * from Employee where convert(date,ondate)='2016-11-08 12:10:04.540'

但是当我将getdate()直接传递到where条件时,它会给出空

select * from Employee where convert(date,ondate)=getdate()

select getdate()结果为2016-11-08 12:10:04.540

所以请给出正确的理由。

3 个答案:

答案 0 :(得分:2)

这是data type precedence正在进行中。在您的第一个查询中,在WHERE子句中,您在比较的一侧有date,在另一侧有varchardate获胜,您的字符串将转换为date,时间将被忽略且每一行都匹配。

在第二个查询中,比较的一侧有date,另一侧有datetimedatetime获胜,date被转换(返回)为datetime,且日期时间与其时间成分不匹配。

如果您想为今天选择值,请使用以下内容:

select * from Employee
where ondate >= DATEADD(day,DATEDIFF(day,0,GETDATE()),0) and
ondate < DATEADD(day,DATEDIFF(day,0,GETDATE()),1)

DATEADD / DATEDIFF表达式有效计算&#34;今天开始的午夜&#34;和&#34;明天开始的午夜&#34;。两个表达式将被计算一次,然后可以使用ondate列上的任何索引(如果存在),并且我们避免过度转换列数据。

答案 1 :(得分:0)

试试这个。

select * from Employee where convert(date,ondate)=Convert(date,getdate())

答案 2 :(得分:0)

SELECT * from Employee where DATEDIFF(DAY,Ondate,'2016-11-08 10:10:04.540') = 0

OR     来自员工的SELECT *,其中DATEDIFF(DAY,Ondate,GETDATE())= 0