正如已经提到过的,您需要使用正确的日期类型才能正常运行。
select *
from student
where convert(date,LEFT(dob,8)) between '20150820' and '20150828'
旁注:你没有明确你的两个日期从文本转换,因为这只要将隐式地使用一个明确的日期表示进行,即ISO标准“YYYYMMDD”或“YYYY-MM -DD”。当然,如果你在变量中保存值,则使用date | datetime数据类型
declare @startdate date
declare @enddate date
select *
from student
where convert(date,LEFT(dob,8)) between @startdate and @enddate
旁注2:你的桌子上DOB列执行的功能会阻止该列的任何索引被用来实现其全部潜力的执行计划,并可能导致较慢的执行,如果可以的话,定义表格dob列的正确数据类型,或者如果您的性能是真正的问题,请使用持久性计算列或实例化视图。旁注3:如果您需要维护数据中的时间部分,即出生日期和时间,请使用以下内容确保捕获所有记录;
select *
from student
where
convert(date,LEFT(dob,8)) >= '20150820'
and convert(date,LEFT(dob,8)) < dateadd(d,1,'20150828')
你做字符串比较不日期转换为日期,应该工作。未来请不要将日期保存为'VARCHAR(14)' – lad2025
更改列日期类型! – jarlh
没有什么奇怪的事情发生。如果将日期存储为varchar,则不能指望它的行为与日期类似。 – Fred