0

Oracleの日付フィールドに日時を挿入したい。これまで完全に機能するsysdateを使用してきましたが、同じタイムスタンプを別のものに使用する必要があります。

オラクルの日付フィールドと互換性のある日時変数を作成する方法を知っている人はいますか? 私が試みるすべてがエラーを引き起こします。

私はこれに沿ってバリエーションを試しました:

Dim timestamp As DateTime = CDate(Now.ToString("yyyy/MM/dd HH:mm:ss"))

.......more code....

insertBuilder.Append("date = to_date(" & timestamp & ")")
4

2 に答える 2

3

DateTimeまず、オブジェクトとそのオブジェクトのフォーマットされたString表現の違いについて混乱しているようですDateTimeNow、またはさらに良いことに、DateTime.NowすでにDateTimeオブジェクトであるため、文字列としてフォーマットしてから文字列を解析してDateTime値に戻すことは意味がありません。したがって、これを行うだけで同じことを実現できます。

Dim timestamp As Date = Date.Now

VB.NET では、 は の省略形であることに注意しDateてください。DateTimeIntegerInt32

DateTime次に、値を SQL コマンド文字列に直接追加しないでください。パラメータ化されたクエリを使用する必要があります。値を SQL 文字列に追加するときはDateTime、( を呼び出して) 適切にフォーマットされていることを確認する必要がありますtimestamp.ToString(...)。残念ながら、どの形式が適切かは、サーバーのカルチャ設定に完全に依存します。したがって、DB パラメータを使用し、パラメータ値を実際のDateTimeオブジェクトと等しく設定し、DB プロバイダに変換を任せる方がはるかに優れています。

于 2013-02-26T16:59:51.127 に答える
1

パラメータ化されたクエリは、ネイティブの .Net DateTime オブジェクトを (たとえば) Enterprise Library に渡し、それが of であることを指定してDbType.DateTimeEL に心配させることができるため、良い出発点です。ただし、ELなどを使用しておらず、質問に投稿されているSQL文字列の使用に固執しているためにそれができない場合は、特にフォーマットに関して、Oracleが日付を内部でどのように扱うかを認識する必要があります。

SQL DeveloperまたはSQLPlusを使用して、次を実行します:

Select To_Char(sysdate) from Dual;

表示される形式は、To_Date を使用する場合に Oracle インスタンスが期待する日付の形式であり、Oracle が To_Char で使用する形式です。いずれかの呼び出しでその形式から逸脱すると、問題が発生します。ただし、使用されているデフォルトの形式に関係なく、呼び出しで指定することでオーバーライドできます。

Select To_Char(sysdate, 'YYYY/MM/DD HH:MI:SS') from Dual;
Select To_Date('2013/02/26 05:03:27', 'YYYY/MM/DD HH:MI:SS') from Dual;

NLS_DATE_FORMAT パラメータを設定することで、Oracle が暗黙的に使用するデフォルトを設定できます。

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH:MI:SS'; 

前のステートメントは、それが実行されるセッションのデフォルトのみを変更することに注意してください。Oracle システムでカスタム形式を使用し、ログオン後のトリガーを使用するすべてのセッションで確実に取得できるようにします。

create or replace TRIGGER NLS_Parameters_OnLogon  AFTER LOGON ON SCHEMA BEGIN    

-- This makes the database case insensitive for sorting and searching and sets the default date format for TO_CHAR and TO_DATE    

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC';   
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI';  
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY/MM/DD HH:MI:SS'''; 
End; 

一部の Oracle 構成ファイルを編集することで、Oracle サーバー全体のデフォルトの日付形式を変更することができますが、制御できないクライアント サーバーに展開する必要があるため、代わりにこの方法を使用します。

この記事は、私が持っているのと同じ種類の根拠をカバーしていますが、例としてもう少し詳しく説明しています。

于 2013-02-26T17:10:40.407 に答える