gpt4 book ai didi

delphi - TDoquery 日期格式

转载 作者:行者123 更新时间:2023-12-02 04:27:27 36 4
gpt4 key购买 nike

我是 Java 开发人员。我在 Delphi 中有一些旧程序。在旧版本中,它们使用mdb。我修复了它以与 SQL Server 连接。所有 SQL 查询均通过 TAdoQuery 实现。

qryTemp.SQL.Text:='select  sum(iif(ComeSumm>0,comesumm,0)),sum(iif(lostSumm>0,lostsumm,0)) from cash '+
'where (IdCashClause is null or idcashclause<>8) '+
' and cashNum='+IntToStr(i)+
' and CashType=0'+
' and format(PayDate,"dd/mm/yyyy")=format('''+DateToStr(Date)+''',"dd/mm/yyyy") ';

程序抛出异常:

Invalid column name 'dd/mm/yyyy'.

我已经修复了其他查询以进行比较:

 qryTemp.SQL.Text:=' select top 1 iif(ComeSumm>0,comesumm,0) from cash '
+' where idCashReason=1 and idCashClause=8 and cashNum='+IntToStr(i)
+' and PayDate<:D'
+' order by payDate desc';
qryTemp.Parameters.ParamByName('D').Value:=DateTimeToStr(Date);

我可以快速修复与 SQL Server 一起使用的所有查询,而无需重写整个项目吗?

最佳答案

假设 PayDate 在 MSSQL 中定义为 date/datetime,您可以使用如下参数:

qryTemp.SQL.Text:=' select top 1 iif(ComeSumm>0,comesumm,0) from cash '
+' where idCashReason=1 and idCashClause=8 and cashNum='+IntToStr(i)
+' and PayDate<:D'
+' order by payDate desc';
qryTemp.Parameters.ParamByName('D').Value := Date;
qryTemp.Parameters.ParamByName('D').DataType := ftDateTime;

我还将 cashNum 更改为参数,即:

...
+' where idCashReason=1 and idCashClause=8 and cashNum=:cashNum'+
...
qryTemp.Parameters.ParamByName('cashNum').Value := i;

始终更喜欢使用与参数兼容的数据类型,而不是格式化和使用字符串。如果您可以显式定义数据类型,SQL 就不需要猜测它们。

注:IIF在 SQL Server 2012 中引入。对于旧版本使用 CASE表达。

<小时/>

在旧的非 Unicode Delphi 版本中,参数存在 Unicode 问题。
因此,如果您使用参数,您可以使用以下内容:

function DateTimeToSqlDateTime(const DT: TDateTime): WideString;
begin
Result := FormatDateTime('yyyy-MM-dd', DT) + ' ' + FormatDateTime('hh:mm:ss', DT);
end;

function SqlDateTimeStr(const DT: TDateTime; const Is_MSSQL: Boolean): WideString;
var
S: WideString;
begin
S := DateTimeToSqlDateTime(DT);
if Is_MSSQL then
Result := Format('CONVERT(DATETIME, ''%s'', 102)', [S])
else
Result := Format('#%s#', [S]); // MS-ACCESS
end;

您的查询将如下所示:

...
+' and PayDate<' + SqlDateTimeStr(Date, True)
...

关于delphi - TDoquery 日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852841/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com