在我的过滤器表单上,我有两个编辑,他们给出的结果就像这样“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吗?
此致
答案 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) ;