Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
SQLServer2005查询在SQLServerManagementStudio Express中工作,但在Delphi2010中不工作_Delphi_Sql Server 2005_Datetime_Delphi 2010 - Fatal编程技术网

SQLServer2005查询在SQLServerManagementStudio Express中工作,但在Delphi2010中不工作

SQLServer2005查询在SQLServerManagementStudio Express中工作,但在Delphi2010中不工作,delphi,sql-server-2005,datetime,delphi-2010,Delphi,Sql Server 2005,Datetime,Delphi 2010,我正在使用SQLServer2005ManagementStudio Express和Delphi2010。Fecha_hora=日期时间是smalldatetime 我的日期格式是dd/mm/yyy “我的表格”中的日期按如下方式保存: 08/01/2013 11:22:00 a.m. 我在Delphi中进行了这个查询,以了解在给定的时间段内,哪些时间的销售额更高;天/月,在这种情况下,我将在2013年1月8日当天进行测试: conect.Q_total_hora.Active:=fal

我正在使用SQLServer2005ManagementStudio Express和Delphi2010。Fecha_hora=日期时间是smalldatetime

我的日期格式是dd/mm/yyy

“我的表格”中的日期按如下方式保存:

08/01/2013 11:22:00 a.m.
我在Delphi中进行了这个查询,以了解在给定的时间段内,哪些时间的销售额更高;天/月,在这种情况下,我将在2013年1月8日当天进行测试:

  conect.Q_total_hora.Active:=false;
  conect.Q_total_hora.SQL.Clear;
  conect.Q_total_hora.SQL.Add('select datepart(hh, fecha_hora) as Hora, sum(Total) as Venta, a.tipo as Tipo');
  conect.Q_total_hora.SQL.Add('from ventas v join articulos a on v.id_articulo=a.id_articulo');
  conect.Q_total_hora.SQL.Add('where tipo='+char(39)+DBLUCB_tipo.Text+char(39)+' and cast(Convert(varchar(10), fecha_hora, 112) as datetime) between'+char(39)+DateToStr(DateTimePicker_fecha1.Date)+char(39)+ 'and'+char(39)+DateToStr(DateTimePicker_fecha2.Date)+char(39));
  conect.Q_total_hora.SQL.Add('group by datepart(hh,fecha_hora), a.tipo order by datepart(hh,fecha_hora) ');
  conect.Q_total_hora.Active:=true;
我使用castConvertvarchar10,fecha_hora,112作为日期时间,因为我在互联网上发现,这样我只能检索日期,而没有时间检索日期之间的数据

在日期时间选择器中,我选择2013年1月8日为2013年1月8日

我使用备忘录查看查询备忘录1.Text:=conect.Q\u total\u hora.Text

我收到的查询是:

select datepart(hh, fecha_hora) as Hora, sum(Total) as Venta, a.tipo as Tipo
from ventas v join articulos a on v.id_articulo=a.id_articulo
where tipo='Burrito Grande' and cast(Convert(varchar(10), fecha_hora, 112) as datetime) between'08/01/2013'and'08/01/2013'
group by datepart(hh,fecha_hora), a.tipo order by datepart(hh,fecha_hora)
我遇到的问题是,当我在SQL Server Mgmt Studio中运行此查询时,它会返回值,但在Delphi中不会返回值。在Delphi中,如果我将DateTimePicker的值设置为2013年8月1日的2013年8月1日,它会返回2012年8月1日的值

据我所知,我知道的不多。。。当我向SQL Server发送查询时,它就像是在用SQL编写查询一样。。。为什么如果我将日期08/01/2013作为字符串发送,它不会返回任何内容

先谢谢你。我不擅长数据库,我在互联网上查找它们的大多数内容^ ^

试试这个:

conect.Q_total_hora.SQL.Add('where tipo='+char(39)+DBLUCB_tipo.Text+char(39)+' and  fecha_hora between '+char(39)+DateToStr(DateTimePicker_fecha1.Date)+char(39)+ ' and '+char(39)+DateToStr(DateTimePicker_fecha2.Date)+char(39));
应该是这样的:

where tipo='Burrito Grande' and fecha_hora between '08/01/2013' and '08/01/2013'
SQL应该自动将日期转换为日期时间,并在需要的地方执行操作

您也可以尝试以下方法:

where tipo='Burrito Grande' and month(fecha_hora) = 8 and year(fecha_hora) = 2013 and day(fecha_hora) = 1
试试这个:

conect.Q_total_hora.SQL.Add('where tipo='+char(39)+DBLUCB_tipo.Text+char(39)+' and  fecha_hora between '+char(39)+DateToStr(DateTimePicker_fecha1.Date)+char(39)+ ' and '+char(39)+DateToStr(DateTimePicker_fecha2.Date)+char(39));
应该是这样的:

where tipo='Burrito Grande' and fecha_hora between '08/01/2013' and '08/01/2013'
SQL应该自动将日期转换为日期时间,并在需要的地方执行操作

您也可以尝试以下方法:

where tipo='Burrito Grande' and month(fecha_hora) = 8 and year(fecha_hora) = 2013 and day(fecha_hora) = 1

您可以避免所有这些问题,并使用参数化查询编写更清晰的代码

试试这个

  conect.Q_total_hora.Active:=false;
  conect.Q_total_hora.SQL.Clear;
  conect.Q_total_hora.SQL.Add('select datepart(hh, fecha_hora) as Hora, sum(Total) as Venta, a.tipo as Tipo');
  conect.Q_total_hora.SQL.Add('from ventas v join articulos a on v.id_articulo=a.id_articulo');
  conect.Q_total_hora.SQL.Add('where tipo=:tipo and fecha_hora between :fecha1 and :fecha2');
  conect.Q_total_hora.SQL.Add('group by datepart(hh,fecha_hora), a.tipo order by datepart(hh,fecha_hora) ');
  conect.Q_total_hora.Prepared:=True;
  conect.Q_total_hora.ParamByName('tipo').AsString   := DBLUCB_tipo.Text;
  conect.Q_total_hora.ParamByName('fecha1').AsDateTime := DateTimePicker_fecha1.Date;
  conect.Q_total_hora.ParamByName('fecha2').AsDateTime := DateTimePicker_fecha2.Date;
  conect.Q_total_hora.Open;

您可以避免所有这些问题,并使用参数化查询编写更清晰的代码

试试这个

  conect.Q_total_hora.Active:=false;
  conect.Q_total_hora.SQL.Clear;
  conect.Q_total_hora.SQL.Add('select datepart(hh, fecha_hora) as Hora, sum(Total) as Venta, a.tipo as Tipo');
  conect.Q_total_hora.SQL.Add('from ventas v join articulos a on v.id_articulo=a.id_articulo');
  conect.Q_total_hora.SQL.Add('where tipo=:tipo and fecha_hora between :fecha1 and :fecha2');
  conect.Q_total_hora.SQL.Add('group by datepart(hh,fecha_hora), a.tipo order by datepart(hh,fecha_hora) ');
  conect.Q_total_hora.Prepared:=True;
  conect.Q_total_hora.ParamByName('tipo').AsString   := DBLUCB_tipo.Text;
  conect.Q_total_hora.ParamByName('fecha1').AsDateTime := DateTimePicker_fecha1.Date;
  conect.Q_total_hora.ParamByName('fecha2').AsDateTime := DateTimePicker_fecha2.Date;
  conect.Q_total_hora.Open;
如果您使用“08/01/2013”和“08/01/2013”之间的术语,您实际上只能看到日期值正好为“08/01/2013”的记录

如果列的类型为date,您将获得所需的内容,但由于列的类型为datetime,因此内容“08/01/2013 11:22”不在“08/01/2013 00:00:00”和“08/01/2013 00:00:00”之间,因此被忽略

查询datetime列时,请使用如下模式

...
where DateTimeCol between '<StartDate>' and '<EndDate> 23:59:59,997'
或者将日期和时间分隔为两列。当然,只有在可能的情况下,并且不需要小于一天的范围,例如一小时左右。

如果您使用“08/01/2013”和“08/01/2013”之间的术语,您确实只能看到日期值正好为“08/01/2013”的记录

如果列的类型为date,您将获得所需的内容,但由于列的类型为datetime,因此内容“08/01/2013 11:22”不在“08/01/2013 00:00:00”和“08/01/2013 00:00:00”之间,因此被忽略

查询datetime列时,请使用如下模式

...
where DateTimeCol between '<StartDate>' and '<EndDate> 23:59:59,997'
或者将日期和时间分隔为两列。当然,只有在可能的情况下,并且不需要小于一天的范围,例如一小时左右。

对于日期范围查询,您应该避免介于两者之间,以及避免任何不明确的日期格式,如m/d/y或d/m/y。最终的查询应该如下所示:如何在delphi代码中实现查询我将留给您:

WHERE fecha_hora >= '20130801' AND fecha_hora < '20130802'
但更好的是,正如其他人所建议的那样,您应该通过参数传入日期值,例如

WHERE fecha_hora >= @date_param AND fecha_hora < DATEADD(DAY, 1, @date_param)
如果您需要单日以外的其他情况,则使用两个参数

有关日期/范围查询的更多背景信息,以及为什么应该这样做:

以及为什么不应使用CONVERT从datetime中删除时间:

您应该避免日期范围查询的介于之间,以及避免任何不明确的日期格式,如m/d/y或d/m/y。最终的查询应该如下所示:如何在delphi代码中实现查询我将留给您:

WHERE fecha_hora >= '20130801' AND fecha_hora < '20130802'
但更好的是,正如其他人所建议的那样,您应该通过参数传入日期值,例如

WHERE fecha_hora >= @date_param AND fecha_hora < DATEADD(DAY, 1, @date_param)
如果您需要单日以外的其他情况,则使用两个参数

有关日期/范围查询的更多背景信息,以及为什么应该这样做:

以及为什么不应使用CONVERT从datetime中删除时间:


它不起作用,我相信是因为smalldatetime中的时间。如果我在“2013-08-01 00:00:00”和“2013-08-01 23:59:00”之间使用where tipo='Burrito Grande'和fecha_hora,这会起作用,但我只想使用Date,我强烈建议不要使用区域格式。甚至我都不知道你是指8月1日还是1月8日。你能描述一下你建议的第一行代码有什么不同吗?它看起来和原来的很相似,而且我总是在那些不同的地方表现得很糟糕。@RobKennedy-我用fecha_hora替换CastVarchar10,fecha_hora,112作为datetime,但它不起作用,我相信这是因为smalldatetime中的时间。如果我使用tipo='Burrito Grande'和fecha_hora'

2013-08-01 00:00:00'和'2013-08-01 23:59:00'但我只想使用日期我强烈建议不要使用区域格式。甚至我都不知道你是指8月1日还是1月8日。你能描述一下你建议的第一行代码有什么不同吗?它看起来和原版很相似,而且我在这些差异游戏中总是表现得很糟糕。@RobKennedy-我将castConvertvarchar10,fecha_hora,112替换为datetime和fecha_Horabeth对于这一点来说很糟糕,因为转换为字符串以摆脱时间。在fecha_hora>='20130801'和fecha_hora<'20130802'的地方尝试一下。。。看到了吗,如果有人进了Jose的玉米煎饼去吃DBLUCB_tipo会怎么样?或者用撇号创建一个tipo。这将导致SQL语法错误。参数化查询也可以避免这个问题!另请参见@AaronBertrand,我将处理日期的方式改为您的,效果很好,它可能没有解决我的问题,即为什么代码在SQL中运行而不是在delphi中运行,但它解决了我的问题,并向我展示了一种更好的使用日期的方式。你能把它改成Answare吗,这样我就可以把它设成Answare了?中间是很糟糕的,因为转换成字符串是为了打发时间。在fecha_hora>='20130801'和fecha_hora<'20130802'的地方尝试一下。。。看到了吗,如果有人进了Jose的玉米煎饼去吃DBLUCB_tipo会怎么样?或者用撇号创建一个tipo。这将导致SQL语法错误。参数化查询也可以避免这个问题!另请参见@AaronBertrand,我将处理日期的方式改为您的,效果很好,它可能没有解决我的问题,即为什么代码在SQL中运行而不是在delphi中运行,但它解决了我的问题,并向我展示了一种更好的使用日期的方式。你能把它改成Answare吗,这样我就可以把它设为Answare了?也许新的查询会起作用,但问题是要解释为什么给定的查询不起作用,而不是其他的方法。@RobKennedy,为什么要为一个坏习惯引起的问题找一个解释呢,将日期时间值作为字符串传递也是这样吗?因为问题要求的是解释。给出一个变通方法和建议,即使用参数而不是使用文字sql语句,也是一个有效的答案。没有充分理由地使用未经参数化的查询通常是不好的做法,使用with DATE/datetime更是如此,正是出于这个原因。也许新的查询会起作用,但问题要求解释为什么给定的查询不起作用,而不是寻找替代方法。@RobKennedy,为什么要为一个错误做法导致的问题寻找解释呢,将日期时间值作为字符串传递也是这样吗?因为问题要求的是解释。给出一个变通方法和建议,即使用参数而不是使用文字sql语句,也是一个有效的答案。没有充分理由地使用未经参数化的查询通常是不好的做法,使用with DATE/datetime更是如此,正是出于这个原因。请注意,这也适用于参数化查询。感谢您指出这一点。事实上,我只是试图回答最初的问题。参数化查询的优点已经有了完整的解释。@alzaimar在传递日期/日期时间值时,您也可以使用DateUtils中的StartOfTheDay/EndOfTheDay函数。@Lightbull:谢谢您的提示。@Lightbull EndOfTheDay会产生什么结果?它是否了解不同的数据类型,以及如何根据基础数据类型是SMALLDATETIME、DATETIME、DATETIME2等来取整或遗漏数据。?请参阅,了解为什么您永远不希望计算范围的结束,以便可以使用BETWEEN-始终计算下一个范围的开始,并使用小于。请注意,这也适用于参数化查询。感谢您指出这一点。事实上,我只是试图回答最初的问题。参数化查询的优点已经有了完整的解释。@alzaimar在传递日期/日期时间值时,您也可以使用DateUtils中的StartOfTheDay/EndOfTheDay函数。@Lightbull:谢谢您的提示。@Lightbull EndOfTheDay会产生什么结果?它是否了解不同的数据类型,以及如何根据基础数据类型是SMALLDATETIME、DATETIME、DATETIME2等来取整或遗漏数据。?请参阅,了解为什么您永远不想计算范围的结束,以便可以使用BETWEEN-始终计算下一个范围的开始,并使用小于。