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

时间:2014-04-30 12:34:15

标签: 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.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)) ' ;

Tar1和Tar2是字符串值。 Sip_tarih是日期时间字段。

我的问题是,我可以按日期获取记录而不在我的SQL中使用CAST吗?

此致

3 个答案:

答案 0 :(得分:5)

您应该可以通过消除所有额外的Convert语句来轻松完成此操作:

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

现在,这就是说,查看参数化的SQL查询也是一个好主意。它不仅消除了在SQL中转换字符串的需要,而且还保护您的应用程序免受SQL注入。根据SQL服务器的不同,它还可以提高性能,因为编译的查询可以使用不同的参数重复使用。

答案 1 :(得分:5)

使用参数化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;

答案 2 :(得分:1)

是的,这应该有效

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

根据您的SQL设置,这可能也有效

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