我有一个像下面这样的员工表
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
所以请给出正确的理由。
答案 0 :(得分:2)
这是data type precedence正在进行中。在您的第一个查询中,在WHERE
子句中,您在比较的一侧有date
,在另一侧有varchar
。 date
获胜,您的字符串将转换为date
,时间将被忽略且每一行都匹配。
在第二个查询中,比较的一侧有date
,另一侧有datetime
。 datetime
获胜,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