sql >> データベース >  >> RDS >> Sqlserver

ストアドプロシージャのSqlParameterでDateTimeを使用すると、フォーマットエラーが発生します

    SqlParameterをどのように設定していますか ? SqlDbTypeを設定する必要があります SqlDbType.DateTimeへのプロパティ 次に、DateTimeを渡します パラメータに直接変換します(文字列に変換しないでください。その場合、多くの問題が発生します)。

    DBに値を取得できるはずです。そうでない場合は、これを行う方法の非常に簡単な例を次に示します。

    static void Main(string[] args)
    {
        // Create the connection.
        using (SqlConnection connection = new SqlConnection(@"Data Source=..."))
        {
            // Open the connection.
            connection.Open();
    
            // Create the command.
            using (SqlCommand command = new SqlCommand("xsp_Test", connection))
            {
                // Set the command type.
                command.CommandType = System.Data.CommandType.StoredProcedure;
    
                // Add the parameter.
                SqlParameter parameter = command.Parameters.Add("@dt",
                    System.Data.SqlDbType.DateTime);
    
                // Set the value.
                parameter.Value = DateTime.Now;
    
                // Make the call.
                command.ExecuteNonQuery();
            }
        }
    }
    

    ここでの問題の一部は、時刻がUTCであるという事実がSQLServerに伝達されていないことを心配していることだと思います。そのためには、SQL Serverは特定の時間帯が特定のロケール/タイムゾーンにあることを認識していないため、そうすべきではありません。

    UTC値を保存する場合は、SQL Serverに渡す前にUTCに変換します(サーバーに、DateTimeを生成するクライアントコードと同じタイムゾーンがある場合を除く)。 、そしてそれでも、それはリスクです、IMO)。 SQL Serverはこの値を格納します。値を取得したときに、現地時間で表示する場合は、自分で行う必要があります(DateTime 構造体は簡単に実行できます)。

    とはいえ、変換を実行してから、変換されたUTC日付(ToUniversalTimeを呼び出して取得した日付)を渡すと、 メソッド(文字列に変換するのではなく)をストアドプロシージャに変換します。

    そして、値を取り戻したら、ToLocalTimeを呼び出します ローカルタイムゾーンで時間を取得する方法。



    1. OracleのCASEステートメントを含む条件付きWHERE句

    2. 数値が浮動小数点か整数かを判断する方法

    3. 破損したTOASTテーブルの修正

    4. PostgreSQL9.4でキャッシングcontribのpg_prewarmとpg_hibernatorを利用します。