Sql server 带年/月/日或年/月/日的Patindex提取日期

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..'

我有以下代码从字符串中提取日期并将其保存到临时表中:

我需要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中包含两位数的月份和两位数的日期。以下是一些在这两种情况下都适用的代码。将这两个条件组合成一个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