【发布时间】: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列(或Date和Time列)中。