3

問題:

私のテーブルのいくつかのフィールドは、日付の形式が正しくありません。C# の .ToString() メソッドを使用してフォーマットされていますが、タイプミスをして次のように入力しました: MM/dd/yyyy hh:mm/ss tt

さて、よく見ると MM/dd/yyyy hh:mm ----> ' / ' <--- ss

これは ' : 'であると想定されます

次に、C#コードで修正する前に(値の一部がフォーマットされていることを意味します:MM/dd/yyyy hh:mm:ss tt

問題は、テーブルから日付順に値を選択しようとしていることです (「Datefieldnamehere」でソートすることはできません)。これは、一部のフィールドが「/」で間違った形式になっているためです。


私が試したこと:

さて、時間は常に同じ場所にあるので(それが私にとって重要なことです)、時間内の数字の部分文字列を取り、それらを並べ替えることができると考えました。最初に午前、次に午後

区切り文字に関係なくすべての日付は常に M/ dd/yyyy hh/mm/ss tt

だから私は試しました:


(
SELECT SN, StatusCode, Time, Mid(Time,14,2) + ':'+ Mid(Time,17,2) AS TTI
FROM OrderStatus
WHERE StatusCode = 'Finished' and Left(Time,10) = '4/20/2012'
AND Time LIKE '*AM'
ORDER BY Val(Mid([Time],11,2)) DESC
)
UNION ALL (
SELECT SN, StatusCode, Time, Mid(Time,14,2) + ':'+ Mid(Time,17,2) AS TTI
FROM OrderStatus
WHERE StatusCode = 'Finished' and Left(Time,10) = '4/20/2012'
AND Time LIKE '*PM'
ORDER BY Val(Mid([Time],11,2)) DESC
);

それが時間単位で注文するかどうかを確認するだけですが、そうではありません: エラー

ご覧のとおり、(時間フィールドで)01、02、01 に戻ります... ?

とにかく、ここに同様の質問があります。私は賞金をかけました。この質問またはその質問に答えると、賞金を獲得できます。これは、他のシナリオでも知っておくと役立ちます。

編集: 文字列の部分文字列でソートする方法について本当に答えてほしい質問。編集が遅れて申し訳ありませんが、私はこれをすでに変更したと断言できました。たとえば、任意の文字列/日付/何かを1桁で並べ替えたいとします。 EndPos))

注:その Order By は完全に間違った結果をもたらします。

4

3 に答える 3

3

私の本能は、関数を作成し、Access UPDATE ステートメントで一度実行して、格納された値を目的の形式に一致するように変換することです。

以下のクイック & ダーティ関数は、1 桁と 2 桁の月の両方に対応しています。Access 2000 以降が必要です。

? FixTimeData("4/20/2012 01:34/09 PM")
4/20/2012 01:34:09 PM
? FixTimeData("12/20/2012 01:34/09 PM")
12/20/2012 01:34:09 PM

Public Function FixTimeData(ByVal pIn As String) As String
    Dim astrPieces() As String
    Dim strOut As String
    astrPieces = Split(pIn, " ")
    strOut = astrPieces(0) & " " & _
        Replace(astrPieces(1), "/", ":") & " " & _
        astrPieces(2)
    FixTimeData = strOut
End Function

次に、これに似た UPDATE ステートメント...

UPDATE OrderStatus
SET time_field = FixTimeData(time_field)
WHERE time_field Like "*/*/*/*";

DAO ではなく ADO でステートメントを実行する場合は、WHERE 句で ANSI ワイルド カード文字に変更します。

WHERE time_field Like "%/%/%/%";

または、ADO または DAO で同じステートメントを機能させたい場合は、ALike で ANSI ワイルド カードを使用します。

WHERE time_field ALike "%/%/%/%";

は予約語であるため、使用time_fieldしたフィールド名として使用しました。フィールド名を変更できない場合は、クエリで角かっこで囲みます。TimeTime

編集:私の意図は、データを修正して、次に基づいて確実にソートできるようにすることでしたRight(time_field, 11)

Edit2 :「上位」の分桁に基づいてソートするには、保存された日付/時刻文字列を修正したと仮定して、このアプローチに基づいて構築できるかどうかを確認します。

? Left(Format(Minute("4/23/2012 04:02:40 PM"), "00"), 1)
0
? Left(Format(Minute("4/23/2012 04:12:40 PM"), "00"), 1)
1
? Left(Format(Minute("4/23/2012 04:22:40 PM"), "00"), 1)
2

このMinute()関数は文字列を受け入れますが、文字列CDate()を に渡す前に明示的に日付/時刻に変換するために使用する可能性がありますMinute()

だから...私が完全に道に迷っていなければ...次のようなクエリでそのアプローチを試してください:

SELECT
    Left(Format(Minute(CDate(time_field)), "00"), 1) AS upper_minute,
    OrderStatus. *
FROM OrderStatus
ORDER BY 1;
于 2012-04-23T18:12:58.847 に答える
2

日付フィールドを文字列ではなく実際の日付フィールドにします。すべての値を 2 つの更新で新しいフィールドに移行します。1 つは古い形式のすべての行を選択し、もう 1 つは新しい形式で選択します。日付の文字列列を削除し、適切に型付けされたデータをお楽しみください。

本当に文字列として保持したい場合は、少なくともソート/ローカリゼーションに安全な標準の ISO8601 形式 (およそ YYYY-MM-DDTHH:MM.ssss) を使用してください。

于 2012-04-23T18:11:37.970 に答える
1

テストするテーブルはありませんが、アイデアを提供したいと思います。
Left、Mid、Right 関数を CDate および CInt 関数と共に使用します。
時間フィールド (16 バイト) の左端の部分を取得し、秒と PM/AM 指定子に「:00」を追加します。この文字列は、CDate を使用して日付に変換できます。
次に、秒の部分を取得して整数に変換します。
これで、UNION を使用せずに、最初の部分 (TTI) を注文してから 2 番目の部分 (TTS) を注文することができます。
しかし、問題があります。一部の日付には 1 文字しかない月が含まれています (es: 4 月 4 日と 12 月 12 日) 幸いなことに、IIF 演算子を使用して、中央、右、左の正しい数字を選択できます。

編集:

SELECT 
SN, StatusCode, Time, 
IIF(Len(Time) = 22, Left(Time,16) + ':00' + Right(Time,2), Left(Time,15) + ':00' + Right(Time,2)) AS TTI, 
IIF(Len(Time) = 22, Mid(Time, 18,2), Mid(Time, 17,2)) as TTS
FROM OrderStatus 
WHERE StatusCode = 'Finished' and Left(Time,10) = '4/20/2012' 
ORDER BY CDate(IIf(Len([Time])=22,Left([Time],16)+ ':00 ' + Right([Time],2),Left([Time],15)+ ':00 ' + Right([Time],2))) DESC , 
         CInt(IIf(Len([Time])=22,CInt(Mid([Time],18,2)),CInt(Mid([Time],17,2)))) DESC;
于 2012-04-23T19:05:13.633 に答える