Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql daterange的数据不相同_Sql_Sql Server 2005 - Fatal编程技术网

Sql daterange的数据不相同

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

我的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)) 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的字符串转换为日期。