web-dev-qa-db-ja.com

c#からsqlにdatetimeを正しく渡す方法は?

テーブルがあり、その中の日時は次の形式です。

2011-07-01 15:17:33.357

オブジェクトで.ToString()を実行するときにc#DateTimeを取得しています。次の形式でDateTimeを取得しています。

04/07/2011 06:06:17

私たちのコードにあるSQLを実行すると動作しない(つまり、正しいDateTimeを選択する)ので、正しいDateTimeを正しく渡す方法を疑問に思っています。 SQLプロファイラーを使用できません。

これはコードです:

//looks to if a user has had any activity in within the last time specified
        public bool IsUserActivitySinceSuppliedTime(int userId, DateTime since)
        {
            //get everything since the datetime specified [usually 5 hours as this is 
            //how long the session lasts for
            string sql = "SELECT * FROM tbl_webLogging WHERE userid = @userid AND DateAdded > @sinceDateTime";

            SqlParameter sinceDateTimeParam = new SqlParameter("@sinceDateTime", SqlDbType.DateTime);
            sinceDateTimeParam.Value = since;

            SqlCommand command = new SqlCommand(sql);
            command.Parameters.AddWithValue("@userid", userId);
            command.Parameters.Add(sinceDateTimeParam);


            using (SqlDataReader DataReader = GetDataReader(command))
            {
                if (DataReader.HasRows)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }


        }

更新*******************

データに対して次を実行しました。

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '2011-07-01 07:19:58.000'

そして

SELECT * FROM tbl_webLogging 
WHERE userid = 1 
AND DateAdded > '04/07/2011 07:19:58'

1つは53レコードを返し、もう1つは69レコードを返します。どうすればいいの?そして、DateTime(04/07/2011 07:19:58)をc#からSQLに渡すと、レコードがまったく表示されません!

26
Exitos

DateTimeの値を持つDateTimeパラメーターを使用することにより、既に正しく実行されているため、shouldすでに機能しています。 ToString()を忘れてください-ここでは使用されていないので。

違いがある場合は、2つの環境間で精度が異なる可能性が最も高くなります。多分丸め(秒、多分?)を選択して使用します。 UTC/local/unknown(DBには日付の「種類」の概念はありませんが、.NETにはあります)にも留意してください。

テーブルがあり、その中の日時は次の形式です:2011-07-01 15:17:33.357

データベース内の日時は、そのような形式ではないことに注意してください。それはあなたの白い嘘を見せているクエリクライアントです。それはnumberとして保存されます(そしてそれは実装の詳細でもあります)。なぜなら、人間はあなたが示した日付40723.6371916281と同じです。愚かな人間。全体を通して単に「日付時刻」として扱うことにより、問題が発生することはありません。

22
Marc Gravell

C#とSqlServerに関連する多くの問題がありました。私は次のことをしました:

  1. SQL Serverでは、DateTime列タイプを使用します
  2. C#では、.ToString( "yyyy-MM-dd HH:mm:ss")メソッドを使用します

また、すべてのマシンが同じタイムゾーンで実行されるようにしてください。

取得するさまざまな結果セットに関して、最初の例は"July First"で、2番目は"7月4日"です。

また、2番目の例は「4月7日」と解釈することもできます。これはサーバーのローカリゼーション構成に依存します(私のソリューションはこの問題の影響を受けません)。

編集:hhはHHに置き換えられました。24時間制のシステムとは対照的に、AM/PMのシステムでは正しい時間をキャプチャできないようです。以下のコメントを参照してください。

7
Eden