Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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
Date Firebird SQL:错误代码-104,令牌未知_Date_Firebird - Fatal编程技术网

Date Firebird SQL:错误代码-104,令牌未知

Date Firebird SQL:错误代码-104,令牌未知,date,firebird,Date,Firebird,我有一个脚本,在下面的Ostendo(一个ERP)中,它运行在firebird数据库上。 脚本是用Pascal编写的。它在TMPQuery2.ExecQuery行返回一个错误“Firebird SQL:错误代码-104,未知标记,'13/04/2018'。我删除了引用文本DATEWORKED={ds'13/04/2018'},并且工作正常。我已经注释掉了我试图解决它的所有其他行,但没有任何行起作用 关于我哪里出了问题,有什么想法吗?我觉得这与日期格式有关。我试过dd-mm-yyyy,yyy-mm

我有一个脚本,在下面的Ostendo(一个ERP)中,它运行在firebird数据库上。 脚本是用Pascal编写的。它在TMPQuery2.ExecQuery行返回一个错误“Firebird SQL:错误代码-104,未知标记,'13/04/2018'。我删除了引用文本DATEWORKED={ds'13/04/2018'},并且工作正常。我已经注释掉了我试图解决它的所有其他行,但没有任何行起作用

关于我哪里出了问题,有什么想法吗?我觉得这与日期格式有关。我试过dd-mm-yyyy,yyy-mm-dd(这是通过excel从OBDC中工作的方式),dd/mm/yyyy(这是在ostendo中显示的方式)


您是从哪里想到Firebird中的日期文字是以类似于
{ds'2018-04-13'}
的格式表示的?将字符串数据类型转换为日期的合法格式列在“”一章的“文字格式”部分

基本上,
yyyy-mm-dd
格式是正确的,但在用pascal连接字符串时,它必须是一个简单的字符串,即
DATEWORKED='''+TSDateWorked+'

但不应将查询构建为字符串,而应使用参数化查询。SQL字符串中的参数通常由名称表示,名称前面有冒号,即
:DateWorked
。因此,您的查询如下所示:

SQLStr := 'SELECT TIMESHEETBATCHNO FROM TIMESHEETLINES WHERE DATEWORKED = :DateWorked AND EMPLOYEENAME = :employee';
...
TMPQuery2.Params[0].AsDateTime := strtodate(SSGetCellText(0,x));
TMPQuery2.Params[1].AsString := 'DE BEER';
TMPQuery2.ExecQuery;
查询组件通常还具有
ParamByName
方法,因此可以使用名称来指定值,而不是参数位置。
我不知道
TpFIBQuery
组件,因此属性/方法名称可能不同,请咨询该组件的帮助。

您从哪里了解到Firebird中的日期文字是以类似
{ds'2018-04-13'}
的格式表示的?将字符串数据类型转换为日期的合法格式列在“文字格式”中第“”章中的“”节

基本上,
yyyy-mm-dd
格式是正确的,但在用pascal连接字符串时,它必须是一个简单的字符串,即
DATEWORKED='''+TSDateWorked+'

但不应将查询构建为字符串,而应使用参数化查询。SQL字符串中的参数通常由前面有冒号的名称表示,即
:DateWorked
。所以您的查询看起来像

SQLStr := 'SELECT TIMESHEETBATCHNO FROM TIMESHEETLINES WHERE DATEWORKED = :DateWorked AND EMPLOYEENAME = :employee';
...
TMPQuery2.Params[0].AsDateTime := strtodate(SSGetCellText(0,x));
TMPQuery2.Params[1].AsString := 'DE BEER';
TMPQuery2.ExecQuery;
查询组件通常还具有
ParamByName
方法,因此可以使用名称来指定值,而不是参数位置。
我不知道
TpFIBQuery
组件,因此属性/方法名称可能不同,请咨询该组件的帮助。

{ds'2018-04-13'}
看起来像ODBC或JDBC转义(除非它是
{d'2018-04-13'}
,而不是
ds
)。请参阅
{ds'2018-04-13'}
看起来像ODBC或JDBC转义(除非它是
{d'2018-04-13'}
,而不是
ds
)。看看什么是
{ds'13/04/2018'}
,为什么你认为它是正确的?ds代表日期戳。还有表示时间戳的ts。我认为在使用同时包含日期和时间的字段时,这可能是必要的。但这似乎只是在Excel中使用ODBC连接时才需要的。我只知道日期是
{d..}
,时间是
{t..}
,时间戳是
{ts..}
,然后只使用yyyy-MM-dd。这些转义是ODBC和JDBC特有的。据我所知,Delphi不支持这些,Firebird本身也绝对不支持。什么是
{ds'13/04/2018'}
,为什么你认为它是正确的?ds代表日期戳。还有表示时间戳的ts。我认为在使用同时包含日期和时间的字段时,这可能是必要的。但这似乎只是在Excel中使用ODBC连接时才需要的。我只知道日期是
{d..}
,时间是
{t..}
,时间戳是
{ts..}
,然后只使用yyyy-MM-dd。这些转义是ODBC和JDBC特有的。据我所知,Delphi不支持这些,Firebird本身也绝对不支持它们。