3

では、ステートメント内のオーストラリアの日付SQLは区切られ、#d/m/yyyy#としてフォーマットされます。例えば:

SELECT * FROM mytable WHERE mydate BETWEEN #2/1/2001# AND #4/3/2001# AND more...

このステートメントを取得しSQLてマッサージする必要があるため、次のように提示できますSQLite

SELECT * FROM mytable WHERE mydate BETWEEN '2001-01-02' AND '2001-03-04' AND more...

次に、タスクは に変換する#xd/xm/yyyy#こと'yyyy-mm-dd'です。「ハロー、ワールド!」正規表現の例。

を使用すると.Global = TRUE、区切り記号を置き換えて、要素を 1 ステップで並べ替えることができます。

vOldPattern = "#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#"
vNewPattern = "'$3-$2-$1'"

これにより、次の中間結果が得られます。

SELECT * FROM mytable WHERE mydate BETWEEN '2001-1-2' AND '2001-3-4' AND more...

1回のパスですべての1桁をパディングできると思いました:

vOldPattern = "-(\d[-'])"
vNewPattern = "-0$1"

しかし、このアプローチでは、最初の (月) 桁のみがパディングされます。諦めて二回通った 先に合わせて "-(\d-)"

そして "-(\d')"

したがって、フォーマットを変更してコンテンツを微調整するための 3 つのパスがあります。確かに、このタスクには単一の検索/置換コマンドがあります。誰かがよりエレガントなソリューションを志願できますか?

また、ランタイムをコンパイルしてエクスポートする必要があるため、遅延バインディングを使用できず、代わりに MS VBScript 正規表現への参照をロードする必要があると思います。私は Win7/32 で開発していますが、アプリは WinXP と下位互換性 (互換性がありますか?) である必要があります。VBScript RegEx ライブラリのどのバージョン (1.0 または 5.5) をロードする必要がありますか?

乾杯!

4

4 に答える 4

1

-ポジティブルックアヘッドを使用して、最初のゼロのみのパディングを回避できます。これは、2番目の数字以外のテストで最後のゼロが消費されるために発生したと思います。-

したがって、以下のように2つのパターンに減らすことができます

一発ではできないと思いますが、見たいです。

置換が混合文字列を処理することを証明するの
2/12/2001
ではなく、使用しました
2/1/2001

Sub Test()
Dim strIn As String
Dim objRegex As Object
strIn = "SELECT * FROM mytable WHERE mydate BETWEEN #2/12/2001# AND #4/3/2001# AND more"
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Global = True
.Pattern = "#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#"
strIn = .Replace(strIn, ("$3-$2-$1"))
.Pattern = "(-)(\d)(?=[^\d])"
strIn = .Replace(strIn, "$10$2")
MsgBox strIn
End With
End Sub
于 2012-10-04T08:59:01.973 に答える
0

上記のブレットの答えは、私にとって十分にエレガントです。2 番目のパスの構文を少しだけ単純化しましたが、Brett のソリューションはコメントとして残しました。

Sub Test()
Dim strIn As String
Dim objRegex As Object
strIn = "SELECT * FROM mytable WHERE mydate BETWEEN #2/12/2001# AND #4/3/2001# AND more"
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
.Global = True
.Pattern = "#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})#"
strIn = .Replace(strIn, ("'$3-$2-$1'"))
'.Pattern = "(-)(\d)(?=[^\d])"
'strIn = .Replace(strIn, "$10$2")
.Pattern = "-(\d)(?=[^\d])"
strIn = .Replace(strIn, "-0$1")
MsgBox strIn
End With
End Sub

brettdj と私は、この問題を 1 回で解決できる方法を見つけたいと思っています。古き良きperlでそれを行うことができるに違いない!

最初の質問の 2 番目の部分は、VBScript RegEx ライブラリのどのバージョン (1.0 または 5.5) を登録すれば、ランタイム アプリケーションを生成できるかということでした。引き金を引いて、5.5 だけを選択しました。バージョン (本当に 1999 年から存在していたのですか?)。アプリケーションは正常にコンパイルされます。スタンドアロンで実行できない場合は、お知らせします。

于 2012-10-05T02:19:07.913 に答える
0

Format()関数を使用して、このタスク全体を実行できると思います。

そうでない場合は、 Format() を使用して先行ゼロを挿入できます。次のようなものです。

vNewPattern = _
    "'" & Format("$3","00") & "-" & Format("$2","00") & "-" & Format("$1","00")

確かに、それはエレガントではありません。ただし、それは明らかであり、同様に効率的である必要があります。

于 2012-10-04T08:18:56.720 に答える
0

正規表現は必要ありません。format() 関数を使用するだけです。

Dim myDate As Date
myDate = #4/3/2001#
Debug.Print Format(myDate, "yyyy-mm-dd")
于 2012-10-04T08:24:18.803 に答える