我使用以下代码从字符串中提取日期并将其保存到临时表中:
我需要patindex是灵活的提取2位数的日期和2位数的月份以及。下面的例子只有一个数字的月份。
DECLARE @Stringval VARCHAR(500);
DECLARE @Dateval DATETIME;
DECLARE @DATETIME_TBL TABLE
(
datetime_val DATETIME
)
SET @Stringval = 'Cairo Egypt - 1-15-10 System 1..'
IF ISDATE(SUBSTRING(@Stringval, patindex('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9]%', @Stringval), 8)) = 1
BEGIN
INSERT INTO @DATETIME_TBL
VALUES (CONVERT(DATETIME, SUBSTRING(@Stringval, patindex('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9]%', @Stringval), 8)))
END
Select * from @DateTIME_TBL我知道对于1-15-10,它可能只需要一个0-9,但无论如何,我们可以灵活地在一个patindex中包含两位数的月份和两位数的日期
发布于 2020-09-18 02:59:36
下面是一些在这两种情况下都有效的代码。将这两个条件合并到一个insert语句中会让我感到紧张。从逻辑上讲,创建两条insert语句(但仅在必要时通过在第一次尝试插入后检查@@rowcount来运行这两条语句)更具自我文档化和可靠性。
变量和临时表
declare @stringval varchar(500)='Cairo Egypt - 1-15-10 System 1..';
declare @stringval_tbl table(
string_val varchar(500));
insert @stringval_tbl select @stringval;
declare @datetime_tbl table (
datetime_val datetime);Insert语句
insert @datetime_tbl
select convert(datetime, substring(st.string_val, ndx.loc+1, 7))
from @Stringval_tbl st
cross apply
(select patindex('% [0-9]-[0-9][0-9]-[0-9][0-9]%', @Stringval) loc) ndx
where ndx.loc>0
and isdate(substring(st.string_val, ndx.loc, 7))=1;
if @@rowcount=0
insert @DATETIME_TBL
select convert(datetime, substring(st.string_val, ndx.loc, 8))
from @Stringval_tbl st
cross apply
(select patindex('%[0-9][0-9]-[0-9][0-9]-[0-9][0-9]%', @Stringval) loc) ndx
where ndx.loc>0
and isdate(substring(st.string_val, ndx.loc, 8))=1;输出(when @stringval=‘开罗埃及- 1-15-10系统1..')
datetime_val
2010-01-15 00:00:00.000Output (when @stringval=‘开罗埃及- 11-15-10系统1..')
datetime_val
2010-11-15 00:00:00.000https://stackoverflow.com/questions/63943287
复制相似问题