SQL从拆分另一个字符串生成字符串

SQL从拆分另一个字符串生成字符串,sql,delphi,Sql,Delphi,我在Advantage数据库中有许多损坏的日期,但幸运的是,我有一个完整的反向日期字段 我需要使用SQL从RDate字符串“yyyyymmdd”以“DD/MM/YYYY”的形式重新创建日期字段 相当于: UPDATE table SET Date = FormatDate('DD/MM/YY',StrToDate('YYYYMMDD',RDate)) 我不知道是否可以在SQL中以这种方式选择字符位置和使用变量,或者是否需要编写一个程序(用Delphi)来执行该操作 谢谢试试类似的东西 upda

我在Advantage数据库中有许多损坏的日期,但幸运的是,我有一个完整的反向日期字段

我需要使用SQL从RDate字符串“yyyyymmdd”以“DD/MM/YYYY”的形式重新创建日期字段

相当于:

UPDATE table SET Date = FormatDate('DD/MM/YY',StrToDate('YYYYMMDD',RDate))
我不知道是否可以在SQL中以这种方式选择字符位置和使用变量,或者是否需要编写一个程序(用Delphi)来执行该操作

谢谢

试试类似的东西

update table set
  date = cast(substring(rdate, 5, 2) + '/' +
    right(rdate, 2) + '/' +
    left(rdate, 4) as date)
/* where ... */
(假设您的连接的日期格式设置是默认的
'MM/DD/YYYY'

请尝试以下操作

update table set
  date = cast(substring(rdate, 5, 2) + '/' +
    right(rdate, 2) + '/' +
    left(rdate, 4) as date)
/* where ... */

(假设您连接的日期格式设置为默认值
'MM/DD/YYYY'

TOndrej我不确定这是语法错误还是无法识别强制转换,但我使用以下SQL实现了所需的结果:

update members set "Expiry Date" = ((substring(RExpiryDate,7,2)) + '/' + (substring(RExpiryDate,5,2)) + '/' + (substring(RExpiryDate,1,4)))

感谢您的帮助

TOndrej我不确定这是语法错误还是无法识别强制转换,但我使用以下SQL实现了所需的结果:

update members set "Expiry Date" = ((substring(RExpiryDate,7,2)) + '/' + (substring(RExpiryDate,5,2)) + '/' + (substring(RExpiryDate,1,4)))


感谢您的帮助

您永远不应该将日期存储为字符串,这只是在以后询问本地化问题。使用Oracle/MS SQL Server,SQL就可以实现类似的功能。。。我不知道该怎么回答这个问题。。。我只是想说:在尝试对数据进行如此大的更正/更改之前,先备份该表。如果这只是一项一次性工作,那么不要费心寻找不寻常的SQL语法。只需从Delphi程序中遍历表格,并更新所有需要更新的内容。@Seph到期日期是日期(4),而Rexpyrydate是字符(8)。你说的本地化问题是什么意思?我的Delphi应用程序通常不会在两者之间转换出现问题。虽然Rexpyrydate确实存在奇怪的、无法解释的损坏,但我通过在电力激增或断电期间使用的记录推测。你永远不应该将日期存储为字符串,这只是要求以后出现本地化问题。使用Oracle/MS SQL Server,SQL可能会出现类似的情况。。。我不知道该怎么回答这个问题。。。我只是想说:在尝试对数据进行如此大的更正/更改之前,先备份该表。如果这只是一项一次性工作,那么不要费心寻找不寻常的SQL语法。只需从Delphi程序中遍历表格,并更新所有需要更新的内容。@Seph到期日期是日期(4),而Rexpyrydate是字符(8)。你说的本地化问题是什么意思?我的Delphi应用程序通常不会在两者之间转换出现问题。虽然我们确实对Rexpyrydate有奇怪的、无法解释的损坏,但我通过记录推测,在电涌或断电期间正在使用。+1子串方法将起作用。我不清楚他是以字符串还是日期的形式存储。将列命名为“date”似乎很麻烦。字段名实际上命名为“Expiry date”和Rexpyrydate,但此子字符串方法在强制转换上抛出7200错误:意外标记:(:在预期的语句结尾后找到了额外的标记-错误位置:39这看起来像语法错误。可能是我的错误,或者您的输入错误…检查+1。子字符串方法将起作用。我不清楚他是存储为字符串还是日期。将列命名为“日期”似乎很麻烦。字段名实际上是命名的“到期日”和Rexpyrydate,但此子字符串方法在cast上抛出7200错误:意外标记:(:在预期的语句结束后找到额外的标记-错误位置:39这看起来像语法错误。可能是我的错误,或者您的输入错误…检查。因此不需要强制转换?似乎Advantage执行隐式强制转换。欢迎,我很高兴我能帮上忙。如果这样做有效,那么“到期日期”"存储为字符串,这就是为什么强制转换为日期不起作用的原因。@ChrisThornton你说得对,Chris我在另一个字符串字段中测试了这一点。它实际上并没有将其转换为日期。我仍然不确定如何执行此操作…所以强制转换是不必要的?似乎Advantage会进行隐式转换。欢迎,我很高兴我能提供帮助。如果这样做有效的话s、 然后“到期日”存储为字符串,这就是为什么强制转换为日期不起作用的原因。@ChrisThornton你说得对,Chris我在另一个字符串字段中测试了这一点。它实际上并没有将其转换为日期。我仍然不确定如何做。。。