2011-12-22 5 views
1

他のテキストでテキストフィールド内に日付を格納しています。なぜ彼らはこれを日付フィールドに入れませんでしたか?私には分かりませんが、私は今それを変更する権限がありません。コードのどこかで、この日付が特定の範囲にあるレコードを取得するためにこれを実行しています。それはうまく動作します。SQL SELECTのwhere句の部分文字列から日付を取得する* EDITED *

For Each i As InventoryItem In inventoryList 
    index = i.Notes.IndexOf("on {") + 4 
    scanned_dt = i.Notes.Substring(index, i.Notes.Length - index - 1) 
    If Date.Parse(scanned_dt) >= startDate And Date.Parse(scanned_dt) <= endDate Then 
    ... 

ここで、特定の期間の合計アイテムを取得しようとしています。 このSQL文は、すべての日付の合計を取得します。

:どのように私だけにWhere句は、私がこのSQLのSELECT文を思い付いたi.Notesが startDateendDate

Dim sql As String = "Select COUNT(inv_PartNum) from lester.inventory i join lester.vendor v on v.vendor_ID = i.vendor_ID Where v.vendor_Name = '" + vendorName + "' AND i.inv_Desc LIKE '%" + size + "%'" 

* EDITED * 間の日付を含む項目を数える更新することができます

SELECT COUNT(i.inv_PartNum) FROM cdms.lester.inventory AS I 
join CDMS.lester.vendor AS v on v.vendor_ID = i.vendor_ID Where v.vendor_Name = 'JVE-285' 
AND CONVERT(DATETIME, 
SUBSTRING(i.inv_Notes, CharIndex('on {', i.inv_Notes)+4, len(i.inv_Notes)-(CharIndex('on {', i.inv_Notes) + 4) 
),101) BETWEEN '01-01-2011' AND '04-04-2011' 

ただし、このエラーが発生しています。 charデータ型をdatetimeデータ型に変換すると、範囲外のdatetime値が発生しました。マイinv_Notes列が「{2011年4月8日にツールトレーラー{JVE-285}に割り当てられたような文字列が含まれてい

SELECT * FROM (
SELECT i.inv_Notes, 
CONVERT(DATETIME,SUBSTRING(i.inv_Notes, CharIndex('on {',i.inv_Notes)+4,LEN(i.inv_Notes)-(CharIndex('on {', i.inv_Notes) + 4)),101) AS d 
FROM cdms.lester.inventory AS i 
join CDMS.lester.vendor AS v ON v.vendor_ID = i.vendor_ID WHERE v.vendor_Name = 'JVE-285') AS s 

はそれを理解しようと、私は、次のSQL SELECT文を作成しました} "

上記のようにクエリを実行すると、inv_Notes列とdate列が取得されます。日付はすべて「2011-04-08 00:00:00.000」の形式で表示され、エラーはスローされません。 charデータ型をdatetimeデータ型に変換すると、範囲外のdatetime値が返されました。私は日付あらゆる方法をフォーマットしようとしたが、常にエラーを取得しました

...私も WHERE s.d IS NOT NULL と同じエラーを取得を試みた

WHERE s.d > CONVERT(DATETIME, '2011-1-1', 101) 

WHERE s.d < GetDate() 

WHERE s.d > '20110101' 

WHERE s.d >= '2011-01-01' 

WHERE s.d >= '01-01-2011' 

WHERE s.d > '01/01/2011' 

EDIT。これは明らかにWHEREの時点でb/cが動作していると思うように動作していないので、変換はすでに正常に行われているはずです。

SOLUTION この作業

SELECT * FROM (
SELECT i.inv_Notes, 
SUBSTRING(i.inv_Notes, CharIndex('} on {',i.inv_Notes)+6,LEN(i.inv_Notes)-(CharIndex('} on {', i.inv_Notes) + 6)) 
AS d 
FROM cdms.lester.inventory AS i 
join CDMS.lester.vendor AS v ON v.vendor_ID = i.vendor_ID WHERE v.vendor_Name = 'JVE-285') AS s 
WHERE PARSENAME(REPLACE(s.d, '/', '.'), 1)+ 
RIGHT('00'+PARSENAME(REPLACE(s.d, '/', '.'), 3),2)+ 
RIGHT('00'+PARSENAME(REPLACE(s.d, '/', '.'),2),2) BETWEEN '20110407' AND '20110409' 

を手に入れた私は、整数比較をint型と行うためにそれをキャストしようとしたが、その後、私はエラーを取得します。 Inv_Notesフィールドのいくつかに「Item added {3/11/2011}」のようなデータが含まれていることが問題であることがわかりました。内側選択の条件が満たされていないので、内側選択で選択されていない場合は、アウターセレクトの条件には問題ありません。しかし、2011年をintにキャストしてエラーを投げようとしていました。私はそれが今までにキャストしようとしていたと確信しています。それが私が以前の問題を抱えていた理由です。

+2

どのようなデータあなたはベースを使用していますか?私はストアドプロシージャを書くことをお勧めします –

答えて

1

試してみてください。これは、あなたの選択を書くに役立つはずSubStringおよびCharIndexメソッドを使用して、この式を日付形式に変換して、Between Operatorで使用できるようにします。

パート2アップデートのベスト:

あなたがwhere句でそれを使用する日付を選択しなくすることができたとして、私はselect文としてそれを使用することをお勧めし、この中を包みます別のステートメント:

SELECT * 
FROM 
(SELECT CAST(SUBSTRING(Notes, CHARINDEX(Notes, 'on {') + 4, Length?) AS Date) AS dtmNotes) 
WHERE dtmNotes BETWEEN Start And End 

これは説明するためのものですが、最初のselectステートメント全体をラッピングに含めます。

+0

同じ解決策がありましたが、エラーが発生しています。上記の編集を参照してください。 – RememberME

+0

デフォルトのサーバー形式で日付を試してください:MM/DD/YYYY –

+0

Nope。私はあまりにもその方法を試してみましたが、良い方法でもう一度やりました。運がない。 – RememberME

1

この投稿を参照してください。文字列フィールドから日付を抽出する方法について説明します。

WHERE CAST(SUBSTRING(Notes, CHARINDEX(Notes, 'on {') + 4, Length?) AS Date) BETWEEN StartDate And EndDate 

アイデアは、あなたが結合することによって、文字列の関連部分を抽出することとなって:あなたの文にWHERE句これに似た何かを追加

SQL: extract date from string

+0

ありがとう!それが私を解決に導いた。私は日付を選択することができますが、WHERE句でそれを使用しようとすると、エラーが発生します。上記の編集を参照してください。 – RememberME

0

が埋め込まれた日付とテーブルがInventoryListと呼ばれ、列はinv_Notes


SELECT * 
FROM InventoryList i 
WHERE 

CAST(
substring(
i.inv_Notes, 
patindex('%on {%',i.inv_Notes) +4, 
patindex('%[0-9][0-9][0-9][0-9]}%',i.inv_Notes)-patindex('%on {%',i.inv_Notes) 
) as Datetime) 

BETWEEN '12/1/2011' AND '12/23/2011 

がEDITと呼ばれていると仮定して...これを試してみてください: "を探して、より制限99999}」パターン


SELECT * 
FROM InventoryList i 
WHERE 

CAST(
substring(
i.inv_Notes, 
patindex('%on {%',i.inv_Notes) +4, 
patindex('%[0-9]/[0-9][0-9][0-9][0-9]}%',i.inv_Notes)-patindex('%on {%',i.inv_Notes) 
) as Datetime) 

BETWEEN '12/1/2011' AND '12/23/2011 
+0

同じエラーが発生します。私が '' SELECT CAST '( 部分文字列( i.inv_Notes、 patindex('%on {% '、i.inv_Notes)+4、 をpatlinすると、'%[0-9] [0-9] [0-9] lime.inventoryから私は '私はdatetimeを列なしで取得しています。(9%[0-9]}% '、i.inv_Notes)-patindex('%on {% '、i.inv_Notes) )エラー、私のバージョンと同じです。 – RememberME

+0

パターン 'on {'は常に一貫していますか?意味は常に存在するのですか?それは常に小文字ですか? –

+0

このwhere句を上記の選択クエリに追加するとどうなりますか?WHERE(patindex( '%on {%'、i.inv_Notes)<> 0) AND(patindex( '%[0-9] [0-9 ] [0-9] [0-9]}% '、i.inv_Notes)<> 0) –

関連する問題