Sql daterange的数据不相同
我的sql有问题。问题是表中的结果数据与我输入的参数不同。 你能检查一下我的代码有什么问题吗 这是我的代码:-Sql daterange的数据不相同,sql,sql-server-2005,Sql,Sql Server 2005,我的sql有问题。问题是表中的结果数据与我输入的参数不同。 你能检查一下我的代码有什么问题吗 这是我的代码:- select distinct convert(varchar(10),a.entered,103) as daterange from customer where ((a.entered BETWEEN convert(varchar(10),&daterangefrom,103) AND convert(varchar(10),&daterangeto,103
select distinct convert(varchar(10),a.entered,103) as
daterange from customer
where
((a.entered BETWEEN convert(varchar(10),&daterangefrom,103) AND convert(varchar(10),&daterangeto,103)) or (convert(varchar(10),&daterangefrom,103) =' ' AND convert(varchar(10),&daterangeto,103) =' '))
检查这个,它对我来说很好:
select distinct convert(varchar(10),a.entered,103) as daterange
from customer a
where ( ( a.entered BETWEEN convert(datetime,&daterangefrom,103)
AND convert(datetime,&daterangeto,103) )
or ( convert(datetime,&daterangefrom,103) = ' '
AND convert(datetime,&daterangeto,103) = ' ' )
)
检查这个,它对我来说很好:
select distinct convert(varchar(10),a.entered,103) as daterange
from customer a
where ( ( a.entered BETWEEN convert(datetime,&daterangefrom,103)
AND convert(datetime,&daterangeto,103) )
or ( convert(datetime,&daterangefrom,103) = ' '
AND convert(datetime,&daterangeto,103) = ' ' )
)
您正在将日期作为字符串进行比较,但所使用的dd/mm/yyyy格式不适用于此类比较。例如,
'2/4/1976'>'1/9/2012'
将日期与日期进行比较:
select distinct convert(varchar(10),a.entered,103) as daterange
from customer
where (
(&daterangefrom = ' ' AND &daterangeto = ' ') or
(a.entered BETWEEN &daterangefrom AND &daterangeto)
)
或者,使用基于ISO 8601的yyyy-mm-dd格式,该格式用作字符串比较:
select distinct convert(varchar(10),a.entered,103) as daterange
from customer
where (
(a.entered BETWEEN convert(varchar(10),&daterangefrom,120) AND convert(varchar(10),&daterangeto,120)) or
(&daterangefrom =' ' AND &daterangeto =' ')
)
您正在将日期作为字符串进行比较,但所使用的dd/mm/yyyy格式不适用于此类比较。例如,
'2/4/1976'>'1/9/2012'
将日期与日期进行比较:
select distinct convert(varchar(10),a.entered,103) as daterange
from customer
where (
(&daterangefrom = ' ' AND &daterangeto = ' ') or
(a.entered BETWEEN &daterangefrom AND &daterangeto)
)
或者,使用基于ISO 8601的yyyy-mm-dd格式,该格式用作字符串比较:
select distinct convert(varchar(10),a.entered,103) as daterange
from customer
where (
(a.entered BETWEEN convert(varchar(10),&daterangefrom,120) AND convert(varchar(10),&daterangeto,120)) or
(&daterangefrom =' ' AND &daterangeto =' ')
)
据我所知,您正在对日期进行一系列转换,以便从时间部分提取日期部分。有更快更简单的方法。我在这里使用的一种方法是:
DateAdd( d, DateDiff( d, 0, SomeDateValue ), 0 )
这将查找0日期(1900-01-01)和SomeDateValue
之间的天数,然后将该天数添加到0日期,生成时间部分为零的日期值。因此,根据您的介绍,一个解决方案是:
Select Distinct DateAdd( d, DateDiff( d, 0, C.Entered ), 0 ) As [Date]
From customer As C
Where (
C.Entered >= DateAdd( d, DateDiff( d, 0, @DateRangeFrom ), 0 )
And
C.Entered < DateAdd( d, DateDiff( d, 0, @DateRangeTo ), 1 )
)
Or ( @DateRangeFrom Is Null And @DateRangeTo Is Null )
此外,出于某种原因,您将@DateRangeFrom
和@DateRangeTo
与空字符串进行比较。假定它们按其应有的方式键入为DateTime
,则不需要这样做。只需检查传递的值是否为空
最后,在任何结果Select语句中,您始终可以仅对输出使用Convert
函数
Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103)
据我所知,您正在对日期进行一系列转换,以便从时间部分提取日期部分。有更快更简单的方法。我在这里使用的一种方法是:
DateAdd( d, DateDiff( d, 0, SomeDateValue ), 0 )
这将查找0日期(1900-01-01)和SomeDateValue
之间的天数,然后将该天数添加到0日期,生成时间部分为零的日期值。因此,根据您的介绍,一个解决方案是:
Select Distinct DateAdd( d, DateDiff( d, 0, C.Entered ), 0 ) As [Date]
From customer As C
Where (
C.Entered >= DateAdd( d, DateDiff( d, 0, @DateRangeFrom ), 0 )
And
C.Entered < DateAdd( d, DateDiff( d, 0, @DateRangeTo ), 1 )
)
Or ( @DateRangeFrom Is Null And @DateRangeTo Is Null )
此外,出于某种原因,您将@DateRangeFrom
和@DateRangeTo
与空字符串进行比较。假定它们按其应有的方式键入为DateTime
,则不需要这样做。只需检查传递的值是否为空
最后,在任何结果Select语句中,您始终可以仅对输出使用Convert
函数
Select Distinct Convert(varchar(10), DateAdd( d, DateDiff(d, 0, C.Entered), 0), 103)
你期望的结果是什么?您得到的结果是什么。是否缺少部分查询?别名
a
来自哪里?您预期的结果是什么?您得到的结果是什么。是否缺少部分查询?别名a
来自哪里?这是我的主要问题。我想输入2011年1月1日至2011年3月17日的数据。但是错误显示“将字符数据类型转换为日期时间数据类型导致日期时间值超出范围”。@Amin:那么您转换的方向是错误的,因为您是从日期转换为字符串,而不是从字符串转换为日期。使用convert(datetime,&daterangefrom,103)
@Amin-为什么不将值作为日期传递给数据库?为什么不在您尝试执行SQL语句之前验证它是否是一个日期?@Amin-此外,该错误几乎肯定表明数据库服务器具有不同的日期顺序(MDY而不是DMY).@Thomas:错误是因为字符串被隐式转换为日期,因为convert
函数需要将日期转换为字符串。如果在convert
调用中指定日期格式,则默认日期格式是什么并不重要。使用convert(datetime,&date,103)
可以正确地将格式为dd/mm/yyyy的字符串转换为日期。这是我的主要问题。我想输入2011年1月1日至2011年3月17日的数据。但是错误显示“将字符数据类型转换为日期时间数据类型导致日期时间值超出范围”。@Amin:那么您转换的方向是错误的,因为您是从日期转换为字符串,而不是从字符串转换为日期。使用convert(datetime,&daterangefrom,103)
@Amin-为什么不将值作为日期传递给数据库?为什么不在您尝试执行SQL语句之前验证它是否是一个日期?@Amin-此外,该错误几乎肯定表明数据库服务器具有不同的日期顺序(MDY而不是DMY).@Thomas:错误是因为字符串被隐式转换为日期,因为convert
函数需要将日期转换为字符串。如果在convert
调用中指定日期格式,则默认日期格式是什么并不重要。使用convert(datetime,&date,103)
可以正确地将格式为dd/mm/yyyy的字符串转换为日期。