【问题标题】:SQL Selecting character string between multiple character non constantSQL在多个字符非常量之间选择字符串
【发布时间】:2018-10-09 11:52:28
【问题描述】:

我的SUBSTRING/CHARINDEX 查询几天前中断了,我很难理解原因。 我正在尝试在 cmets 中选择“Appt.Date:”和“Appt.Time:”之间的字符(Date),例如:

Status: Future Appointment  Appt. Date:12/14/18  Appt. Time:9:30am
Status: Obtaining Results  Appt. Date:10/05/18  Appt. Time:4:00
Status:   Appt. Date:8/28/2018  Appt. Time: 9:15am

使用这个查询:

select ltrim(
            rtrim(
                SUBSTRING([Order Comments], 
                      CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:'), 
                      CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - 
                          (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:'))
                 )
            )
        ) as 'OrderApptDate'
FROM [HIRS_Tools].[dbo].[OMT_BOD]
WHERE [Order Comments] like 'status:%'

SQL 错误:

传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

我应该采用不同的方法来选择日期字符,还是我当前的查询存在问题?任何帮助将不胜感激。

【问题讨论】:

  • 所有数据是否都遵循“Appt. Date: .... Appt. Time”格式?
  • 是,但不是 Appt 之前的字符。日期:
  • 您是否尝试显示长度表达式的值:select [Order Comments], CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:') as TargetLength from ...;?有什么不寻常的价值观吗?您应该能够将其逐个分解,直到找到错误的表达式或(令人震惊的!)错误数据。
  • HABO - 感谢您提供此代码和好主意。我会尝试使用它来查找错误数据。拥有 150 多个入门用户,令人震惊的糟糕数据有时是这里的常态。 (笑)
  • 嗯,这对于数据库来说是一个糟糕的设计。约会时间和日期应存储在专用的DateTime2 列(或DateTime 列)中。

标签: tsql substring charindex


【解决方案1】:

首先,非常感谢大家的帖子。尽管他们都没有给我确切的答案,但他们都给了我一块来回答这个难题。特别是HABO和3N1GM4!

最终我发现 Appt Date 和 Appt Time 字段并不总是完全相同。有Appt的组合。日期:&Appt。时间,Appt。日期 - &Appt。时间、申请日期和申请。时间...都是从HABO的字段长度表达式中发现的。 因此,我添加了一个针对每个 [Appt Date/Appt Time] 组合字段长度进行调整的 case 语句。这解决了所有问题,并为我提供了足够的筹码让我的用户清理剩余的记录并实施更好的数据输入工作流程。

新查询如下所示:

select
 case 
  when CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:')) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt. Time%'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:'), CHARINDEX('Appt. Time:',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:')))))
  when CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date:', [Order Comments])) - (CHARINDEX('Appt. Date:', [Order Comments]) + LEN('Appt. Date:')) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt Time%'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt Date:', [Order Comments]) + LEN('Appt Date:'), CHARINDEX('Appt Time:',[Order Comments], CHARINDEX('Appt Date:', [Order Comments])) - (CHARINDEX('Appt Date:', [Order Comments]) + LEN('Appt Date:')))))
  when (CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date -', [Order Comments])) - (CHARINDEX('Appt. Date -', [Order Comments]) + LEN('Appt. Date -'))) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt. Date -%'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt. Date -', [Order Comments]) + LEN('Appt. Date -'), CHARINDEX('Appt. Time:',[Order Comments], CHARINDEX('Appt. Date -', [Order Comments])) - (CHARINDEX('Appt. Date -', [Order Comments]) + LEN('Appt. Date -')))))
  when (CHARINDEX('Appt. Time',[Order Comments], CHARINDEX('Appt. Date ', [Order Comments])) - (CHARINDEX('Appt. Date ', [Order Comments]) + LEN('Appt. Date '))) <15
  and [Type]='Procedure' AND [Order Comments] like 'status:%' and [Order Comments] like '%Appt. Date %'
       then ltrim(rtrim(SUBSTRING([Order Comments], CHARINDEX('Appt. Date ', [Order Comments]) + LEN('Appt. Date '), CHARINDEX('Appt. Time:',[Order Comments], CHARINDEX('Appt. Date ', [Order Comments])) - (CHARINDEX('Appt. Date ', [Order Comments]) + LEN('Appt. Date ')))))
       else [Date - Due] end as 'OrderApptDate'

FROM [HIRS_Tools].[dbo].[OMT_BOD]
WHERE ([Order Comments] like 'status:%')

再次感谢您的帮助,我希望将来有人会发现这很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2013-12-31
    • 2020-03-27
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多