Sql 筛选日期时间截止日期时,我没有得到任何结果
我有这样的疑问:Sql 筛选日期时间截止日期时,我没有得到任何结果,sql,sql-server,Sql,Sql Server,我有这样的疑问: select empid,transDateTime from Trans_Details where empId='16510' and transDateTime >='2015-05-07 00:00:00.000' and transDateTime< ='2015-05-07 23:59:59.000' empid transDateTime --------------- ----------------------- 16
select empid,transDateTime
from Trans_Details
where empId='16510'
and transDateTime >='2015-05-07 00:00:00.000'
and transDateTime< ='2015-05-07 23:59:59.000'
empid transDateTime
--------------- -----------------------
16510 2015-05-07 08:51:56.000
我有相同的没有时间的查询,但该查询不会返回任何结果:
select empid, transDateTime
from Trans_Details Td
where td.empId='16510'
and Td.transDateTime='2015-05-07'
有什么问题吗?这次我想得到同样的结果。这是因为
transDateTime
是DATETIME
类型。在您的WHERE
子句中,2015-05-07
被转换为DATETIME
,从而产生2015-05-07 00:00:00.000
您可以改为使用此选项:
WHERE CAST(transDateTime AS DATE) = '20150507'
请注意,您应该使用日期文字的YYYYMMDD
格式
另一种避免在
WHERE
子句左侧使用函数的方法是:
WHERE
transDateTime >= CAST('20150507' AS DATETIME)
AND transDateTime < DATEADD(DAY, 1, CAST('20150507' AS DATETIME))
在哪里
transDateTime>=转换('20150507'作为日期时间)
和transDateTime这是因为transDateTime
属于DATETIME
类型。在您的WHERE
子句中,2015-05-07
被转换为DATETIME
,从而产生2015-05-07 00:00:00.000
您可以改为使用此选项:
WHERE CAST(transDateTime AS DATE) = '20150507'
请注意,您应该使用日期文字的YYYYMMDD
格式
另一种避免在WHERE
子句左侧使用函数的方法是:
WHERE
transDateTime >= CAST('20150507' AS DATETIME)
AND transDateTime < DATEADD(DAY, 1, CAST('20150507' AS DATETIME))
在哪里
transDateTime>=转换('20150507'作为日期时间)
和transDateTime
试试这个
select empid,transDateTime from Trans_Details Td where td.empId='16510'
and convert(date,Td.transDateTime)='2015-05-07'
试试这个
select empid,transDateTime from Trans_Details Td where td.empId='16510'
and convert(date,Td.transDateTime)='2015-05-07'
你最好两面都投
WHERE CAST(transDateTime AS DATE) = CAST('2015-05-07' AS DATE)
你最好两面都投
WHERE CAST(transDateTime AS DATE) = CAST('2015-05-07' AS DATE)
第二个查询将不起作用,因为'2015-05-07'
将转换为datetime作为'2015-05-07 00:00:00.000'
,然后进行比较以确定是否完全相等
这里建议的其他解决方案是在transDateTime
列上使用cast,但也有一个缺点:您将无法在查询中使用涉及该列的索引。因此,如果该表中有大量数据(假设有数百万行),那么最好坚持使用第一个解决方案,该解决方案更详细,但性能要好得多(如果您对该列进行了索引)。对正确性的轻微修改:
select empid, transDateTime
from Trans_Details
where empId = '16510'
and transDateTime >= '2015-05-07 00:00:00.000'
and transDateTime < '2015-05-08 00:00:00.000'
选择empid,transDateTime
来自Trans_详细信息
其中empId='16510'
和transDateTime>=“2015-05-07 00:00:00.000”
和transDateTime<'2015-05-08 00:00:00.000'
第二个查询将不起作用,因为'2015-05-07'
将转换为日期时间为'2015-05-07 00:00:00.000'
,然后比较是否完全相等
这里建议的其他解决方案是在transDateTime
列上使用cast,但也有一个缺点:您将无法在查询中使用涉及该列的索引。因此,如果该表中有大量数据(假设有数百万行),那么最好坚持使用第一个解决方案,该解决方案更详细,但性能要好得多(如果您对该列进行了索引)。对正确性的轻微修改:
select empid, transDateTime
from Trans_Details
where empId = '16510'
and transDateTime >= '2015-05-07 00:00:00.000'
and transDateTime < '2015-05-08 00:00:00.000'
选择empid,transDateTime
来自Trans_详细信息
其中empId='16510'
和transDateTime>=“2015-05-07 00:00:00.000”
和transDateTime<'2015-05-08 00:00:00.000'
这一次我如何从这个日期获取vale?我会给你-1作为第一个解决方案,给你+1作为“替代方法”。在筛选的字段上放置函数是不好的做法。但正如@StuartLC在下面指出的那样,转换(日期,…)
自动转换为@1转换到日期
是SARGABLE
。看。这一次我如何从这个日期取vale?我给你-1作为第一个解决方案,+1作为“替代方法”。在筛选的字段上放置函数是不好的做法。但正如@StuartLC在下面指出的那样,转换(日期,…)
自动转换为@1转换到日期
是SARGABLE
。请参阅。不要与='2015-05-07'和Td.transDateTime<'2015-05-08'
进行比较。不要与='2015-05-07'和Td.transDateTime<'2015-05-08'
转换(日期,…)
是为数不多的(?单调的)之一,但一般来说,将函数应用于谓词中的列不是一个好主意。转换(日期,…)
是为数不多的(?单调)函数之一,但一般来说,将函数应用于谓词中的列不是一个好主意。