Как извлечь даты из строки varchar - PullRequest
1 голос
/ 18 мая 2011

Как извлечь даты из строки varchar;

Формат данных:

    Rates from 16th April  2011 to 31st Aug 2011

Я хочу выводить как '16/04/2011' и '31/08/2011'

С уважением, Нитин

1 Ответ

2 голосов
/ 18 мая 2011

Чтобы не играть с партией конца дня, такой как "d", "st" и т. Д., Лучше разбить вашу строку на слова и затем проанализировать ее. Двойные пробелы удаляются в начале.

 DECLARE @s NVARCHAR(MAX)= 'Rates from 16th April  2011 to 2st Aug 2011'
SET @s = REPLACE(@s, '  ', ' ')
DECLARE @BegDay VARCHAR(2)= '' ,
    @begMonth NVARCHAR(100) ,
    @BegYear VARCHAR(4)
DECLARE @EndDay VARCHAR(2) ,
    @EndMonth NVARCHAR(100) ,
    @EndYear VARCHAR(4)
DECLARE @BegDate DATETIME ,
    @EndDate DATETIME
DECLARE @Words TABLE
    (
      Word NVARCHAR(1000) ,
      WordNr INT
    ) ;
WITH    c ( Char, Pos, WordNr )
          AS ( SELECT   SUBSTRING(@s, 1, 1) CHAR ,
                        1 ,
                        CAST(0 AS BIGINT)
               UNION ALL
               SELECT   SUBSTRING(@s, pos + 1, 1) CHAR ,
                        pos + 1 ,
                        CASE WHEN SUBSTRING(@s, pos + 1, 1) = SPACE(1)
                             THEN c.WordNr + 1
                             ELSE c.WordNr
                        END
               FROM     c
               WHERE    pos < LEN(@s)
             )
    INSERT  INTO @Words
            ( Word ,
              WordNr 
            )
            SELECT  RTRIM(LTRIM(SUBSTRING(@s, c.Pos,
                                          ISNULL(c2.Pos, LEN(@s)) - c.Pos + 1))) ,
                    c.WordNr + 1
            FROM    ( SELECT    *
                      FROM      c
                    ) c
                    LEFT OUTER JOIN C C2 ON c2.WordNr = c.WordNr + 1
                                            AND c2.Char = ' '
            WHERE   c.char = ' '
                    OR c.Pos = 1 ;
WITH    c ( Word, [CHAR], Pos )
          AS ( SELECT   T.Word ,
                        CAST(SUBSTRING(T.Word, 1, 1) AS NVARCHAR(100)) ,
                        1
               FROM     @Words T
               WHERE    WordNr = 3
               UNION ALL
               SELECT   c.Word ,
                        CAST(SUBSTRING(c.Word, 1, pos + 1) AS NVARCHAR(100)) ,
                        pos + 1
               FROM     c
               WHERE    ISNUMERIC(SUBSTRING(C.Word, c.pos + 1, 1)) = 1
             )
    SELECT TOP 1
            @BegDay = char
    FROM    c
    ORDER BY pos DESC

SET @begMonth = ( SELECT    T.Word
                  FROM      @Words T
                  WHERE     T.WordNr = 4
                )
SET @BegYear = ( SELECT T.Word
                 FROM   @Words T
                 WHERE  T.WordNr = 5
               )

SET @BegDate = @BegDay + '' + @begMonth + @Begyear ;
WITH    c ( Word, [CHAR], Pos )
          AS ( SELECT   T.Word ,
                        CAST(SUBSTRING(T.Word, 1, 1) AS NVARCHAR(100)) ,
                        1
               FROM     @Words T
               WHERE    WordNr = 7
               UNION ALL
               SELECT   c.Word ,
                        CAST(SUBSTRING(c.Word, 1, pos + 1) AS NVARCHAR(100)) ,
                        pos + 1
               FROM     c
               WHERE    ISNUMERIC(SUBSTRING(C.Word, c.pos + 1, 1)) = 1
             )
    SELECT TOP 1
            @EndDay = char
    FROM    c
    ORDER BY pos DESC

SET @EndMonth = ( SELECT    T.Word
                  FROM      @Words T
                  WHERE     T.WordNr = 8
                )
SET @EndYear = ( SELECT T.Word
                 FROM   @Words T
                 WHERE  T.WordNr = 9
               )

SET @EndDate = @EndDay + '' + @EndMonth + @Endyear

SELECT  @BegDate Begindate ,
        @EndDate EndDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...