2

スクリーンショットはそれをすべて説明しています。 http://i46.tinypic.com/f3hobl.png

現在の構成では、InvoiceSentDateは 8 桁の日付 (MM-DD-YY) のみを受け入れます。MM-DD-YYYY の日付もキャプチャできるようにしたいです。どうすればいいですか?

比較のために、請求書 2106-2112 と 2116 を見てください。

さらに、物事を複雑にするために!一部のレコードには、日付の後にテキストがあります。 http://i50.tinypic.com/2r5qa88.png

4

2 に答える 2

4

これは、純粋なT-SQLで実行できます。これが動作するSqlFiddleです。

ここでは、日付をpatindex検索し、その後に最初の非数字を検索しています。substringこれにより、日付だけを取得するために必要なパラメータが得られます。ご覧のとおり、スラッシュとダッシュの日付区切り文字など、さまざまな可能性をカバーするいくつかのテストデータを追加しました。

-- Test data
declare @Demo table (
    RawData varchar(100) null
)
insert into @Demo select 'JS sent via Unifier on 08/29/2012'
insert into @Demo select 'i sent via email on 09/07/12'
insert into @Demo select 'i sent via Unifier on 01/04/12; resubmitting p...'
insert into @Demo select 'JS sent via Unifier on 08-29-2012; resubmitting p...'
insert into @Demo select '08-29-2012; resubmitting p...'
insert into @Demo select '08-29-12'
insert into @Demo select 'no date here'
insert into @Demo select null

-- Actual query
select *,
    -- If there's a date, display it
    case when StartChar > 0 then substring(RawData, StartChar, DateLen) else null end as DateString 
from (
    select *,
        -- Find the first date
        patindex('%[0-1][0-9][/-][0-3][0-9][/-][0-9][0-9]%', RawData) as StartChar,
        -- Find the first non-digit after that date
        patindex(
            '%[^0-9]%', 
            right(
                RawData + '_', -- This underscore adds at least one non-digit to find
                len(RawData) - patindex('%[0-1][0-9][/-][0-3][0-9][/-][0-9][0-9]%', RawData) - 6
            )
        ) + 7 as DateLen
    from @Demo
) as a

アップデート

2つの可能な日付形式を探しているだけの場合は、それらをチェックするだけでクエリをいくらか簡単にすることができます。

select *,
    -- If there's a date, display it
    case
        when StartChar1 > 0 then substring(RawData, StartChar1, 10)
        when StartChar2 > 0 then substring(RawData, StartChar2, 8)
        else null
    end as DateString 
from (
    select *,
        -- Find the first MM-DD-YYYY
        patindex('%[0-1][0-9][/-][0-3][0-9][/-][0-9][0-9][0-9][0-9]%', RawData) as StartChar1,
        -- Find the first MM-DD-YY
        patindex('%[0-1][0-9][/-][0-3][0-9][/-][0-9][0-9]%', RawData) as StartChar2
    from @Demo
) as a
于 2012-09-21T16:47:08.723 に答える
1

CndiedCode からのリンクの例は、必要なものに非常に近いものです。

わずかに異なる正規表現の一致

N'^\d{3}-\d{2}-\d{4}$'

N'\d{2}/\d{2}/\d{2,4}'に移動します

以下のコードは、\ をエスケープする必要があるため、見た目が異なります。

    if (Regex.IsMatch("sent on 01/01/10; ex", "\\d{2}/\\d{2}/\\d{2,4}"))
    {
        System.Diagnostics.Debug.WriteLine(Regex.Match("sent on 01/01/10; ex", "\\d{2}/\\d{2}/\\d{2,4}"));
    }
    if (Regex.IsMatch("sent on 01/01/2012; ex", "\\d{2}/\\d{2}/\\d{2,4}"))
    {
        System.Diagnostics.Debug.WriteLine(Regex.Match("sent on 01/01/2012; ex", "\\d{2}/\\d{2}/\\d{2,4}"));
    }
于 2012-09-21T15:36:04.240 に答える