Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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 如何在不使用CAST的情况下按日期选择记录?_Sql_Delphi - Fatal编程技术网

Sql 如何在不使用CAST的情况下按日期选择记录?

Sql 如何在不使用CAST的情况下按日期选择记录?,sql,delphi,Sql,Delphi,在我的筛选表上,我有两个编辑,他们给出的结果如下“01.12.2014” 这是土耳其标准,格式为dd.mm.yyyy 在代码部分,我控制了它们,并使用formatdatetime转换值。并创建一个选择sql if edtTar1.Value>0 then tar1:=FormatDateTime('yyyymmdd',edtTar1.Value); if edtTar2.Value>0 then tar2:=FormatDateTime('yyyymmdd',edtTar2.

在我的筛选表上,我有两个编辑,他们给出的结果如下“01.12.2014”

这是土耳其标准,格式为dd.mm.yyyy

在代码部分,我控制了它们,并使用formatdatetime转换值。并创建一个选择sql

  if edtTar1.Value>0 then tar1:=FormatDateTime('yyyymmdd',edtTar1.Value);
  if edtTar2.Value>0 then tar2:=FormatDateTime('yyyymmdd',edtTar2.Value);

  tarsart := ' and ( Convert(nvarchar(8), Sip_Tarih, 112) >= Convert(nvarchar(8), cast('+QuotedStr(tar1)+' as datetime), 112) '+
  ' and Convert(nvarchar(8), Sip_Tarih, 112) <= Convert(nvarchar(8), cast('+QuotedStr(tar2)+' as datetime), 112)) ' ;
如果edtTar1.Value>0,则tar1:=FormatDateTime('yyyymmdd',edtTar1.Value);
如果edtTar2.Value>0,则tar2:=FormatDateTime('yyyyymmdd',edtTar2.Value);
tarsart:='和(Convert(nvarchar(8),Sip_Tarih,112)>=Convert(nvarchar(8),cast(“+QuotedStr(tar1)+”as datetime),112)'+

'和Convert(nvarchar(8),Sip_Tarih,112)通过消除所有额外的
Convert
语句,您应该能够轻松地做到这一点:

tarsart := ' and (Sip_Tarih >= cast('+QuotedStr(tar1)+' as datetime) '+
' and Sip_Tarih <= cast('+QuotedStr(tar2)+' as datetime)) ';
tarsart:='and(Sip_Tarih>=cast('+QuotedStr(tar1)+'as datetime)'+
“还有Sip_Tarih是的,这应该行得通

tarsart := ' and Sip_Tarih >= cast('+QuotedStr(tar1)+' as datetime)) '+
' and Sip_Tarih <= cast('+QuotedStr(tar2)+' as datetime)) ' ;

tarsart:=“和Sip_Tarih>=cast(“+QuotedStr(tar1)+”as datetime))”+
“和Sip_Tarih=”+QuotedStr(tar1)+

'和Sip_Tarih使用参数化SQL查询,让数据库为您处理日期/时间格式,并消除不必要的转换:

tarsart := ' and (Sip_Tarih >= :ptar1) and (Sip_Tarih <= :ptar2) ' ;

我目前正在尝试最小化使用tadoquery计数。因此,我对多个表单使用相同的查询。因此,我认为在这一步中使用参数不合适。通过设置SQL,然后在运行时进行参数绑定,您仍然可以重用
tadoquery
对象。这样可以通过提取动态SQ获得更多收益L转换为常量并减少代码中的字符串操作。如果提到参数,则为+1,如果不显示参数,则为-1。根据您的SQL设置,您是否可以再解释一下?tarsart:='和Sip_Tarih>='+QuotedStr(tar1)+'和Sip_Tarih如果SQL server默认将格式为yyyymmdd的字符串识别为日期,则不需要强制转换为DateTime。或者,您可以找出SQL默认使用的日期格式,并将字符串作为该格式传递,以避免额外的强制转换。@afrazier,因为您应该尝试使用参数化查询to避免SQL注入的风险,虽然在这种情况下风险很低,因为您正在将日期转换为字符串以附加到查询中,但这是一个好习惯。正如您所说,“或者,您可以找出SQL默认使用的日期格式,并将字符串作为该格式传递,以避免额外的强制转换。”我想了解我们如何做到这一点。您正在寻找错误的解决方案。使用日期-时间控件和参数化查询。这样您就不必强制转换,也不必担心用户首选的日期格式。(仅仅因为你的用户是土耳其人并且在土耳其工作并不一定意味着他们都会使用通用的土耳其语日期格式。)换句话说,你的整个问题就消失了。
tarsart := ' and (Sip_Tarih >= :ptar1) and (Sip_Tarih <= :ptar2) ' ;
Query.SQL.Text := ... + tarsart + ...;
Query.ParamByName('ptar1').AsDateTime := edtTar1.Value;
Query.ParamByName('ptar2').AsDateTime := edtTar2.Value;