Sql server 带年/月/日或年/月/日的Patindex提取日期
我有以下代码从字符串中提取日期并将其保存到临时表中: 我需要patindex能够灵活地提取2位数的日期和2位数的月份。下面的示例只有一位数的月份Sql server 带年/月/日或年/月/日的Patindex提取日期,sql-server,tsql,Sql Server,Tsql,我有以下代码从字符串中提取日期并将其保存到临时表中: 我需要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..'
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中包含两位数的月份和两位数的日期。以下是一些在这两种情况下都适用的代码。将这两个条件组合成一个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 @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;
输出(当@stringval='Cairo埃及-1-15-10系统1..'时)
输出(当@stringval='Cairo埃及-11-15-10系统1..'时)
datetime_val
2010-01-15 00:00:00.000
datetime_val
2010-11-15 00:00:00.000