2015-08-28 70 views
-2

在sql查询中有这个奇怪的错误。运算符之间的Sql查询的奇怪行为

查询是这样的。

select * from student where dob between '20150820' and '20150828' 

但在数据库DOB的列是VARCHAR(14),是YYYYMMDDHHMMSS格式,说我的行中的数据是(20150827142545)。如果我火了上面的查询不应该retrive任何行作为我在查询中提到了yyyyMMdd格式,但它回复了昨天的日期(即20150827112535),并且无法获得当天日期的记录(即20150828144532)

为什么会发生这种情况?

感谢您的帮助提前

+1

你做字符串比较不日期转换为日期,应该工作。未来请不要将日期保存为'VARCHAR(14)' – lad2025

+2

更改列日期类型! – jarlh

+4

没有什么奇怪的事情发生。如果将日期存储为varchar,则不能指望它的行为与日期类似。 – Fred

回答

1

你可以尝试这样的:

select * from student 
where convert(date,LEFT(dob,8)) between 
     convert(date'20150820') and convert(date,'20150828')) 

此外,正如其他人评论您需要存储您的日期作为Date,而不是varchar在将来避免此类问题。

+0

谢谢.....但我的问题是为什么它显示昨天的日期与我的错误查询记录?? –

+0

@BhanuChowdary: - 原因可能是因为'BETWEEN'在SQL Server中是不对称的,日期被比较为字符串而不是日期 –

+0

: - 是的..真的。日期被比较为字符串,但为什么以及如何查询我是这些日期之间的记录,不包括查询中指定的日期,甚至字符串都是yyyyMMddhhmmss格式。但在查询中,我只以yyyyMmdd格式指定了它。它是如何匹配指定日期之间的记录的? ? –

0

所有您需要做的是先转换字符串到目前为止。

select * 
from student 
where dob between convert(date, '20150820') and convert(date, '20150828') 
1

正如已经提到过的,您需要使用正确的日期类型才能正常运行。

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') 
+1

谢谢爱德华....我知道它可以使用convert函数来完成......但我的问题在于,如果查询的类型为varchar,它的行为如何...为什么它会显示这些日子之间的记录排除我在查询中提到的日期.. –

+1

我看到你的问题,我明白当比较字符数据时,它将从最左边的字符串开始,当字符串长度不等时,较长的字符串被视为在。这就是为什么你的第一次约会出现,第二次约会没有。换句话说,AB在ABC之前出现,ABC在AC之前出现,数字12之前出现在123和123之前出现在13之前。回到原始数据20150827142545介于20150827 [------]和20150828之间[--- ---],而20150828144532在20150828 [------]之后,因此被排除在结果集之外。 –

+0

Ohhh ...好的,谢谢你,非常感谢.... :) –

0

这是怎么发生的?

比较从左到右执行,字符顺序由正在使用的代码页决定。

排序

排序顺序指定数据值进行排序的方式,影响 数据比较的结果。数据排序通过排序完成 ,并且可以使用索引进行优化。

https://msdn.microsoft.com/en-us/library/ms143726.aspx