2011-07-04 7 views
22

私はそれでテーブルおよび日時を持っているの形式は、次のとおりです日時をC#からSQLに正しく渡すには?

2011-07-01 15:17:33.357 

私は.ToStringを(行うとき、私は私が形式でのDateTimeを取得していますオブジェクト上)のAC#の日時を取っています:

04/07/2011 06:06:17 

私は(つまり、正しい日時を選択します)私は我々のコードであるSQLを実行すると、それは動作しませんので、私は正しくて、正しい日時を渡す方法を思ったんだけど。 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; 
       } 
      } 


     } 

UPDATE *******************

私は、データ上で次のコマンドを実行しています

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' 

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

+1

テーブルの「DateAdded」列のタイプは何ですか?それはDateTimeですか?それとも何らかのvarchar? –

+0

'[n] varchar(x)'のようなものではなく、 'DateAdded'の型が' datetime'であることを確認できますか? –

+0

なぜ、C#datetimeは0レコードで戻ってくるのですか? (デバッガは'04/07/2011 07:19:58 'と言っています)@Marasのデータ型はdatetime .... – Exitos

答えて

19

あなたは既にDateTimeからの値でDateTimeパラメータを使用して、正しくそれをやったので、それは、はすでに動作するはずです。 ToString()については忘れてください。ここでは使用していません。

違いがある場合は、2つの環境間で精度が異なる可能性が最も高くなります。おそらく丸め(秒、おそらく?)を選択し、それを使用します。また、UTC/local/unknown(データベースには日付の「kind」という概念はありません; .NETがあります)を覚えておいてください。

Iは、テーブルを持っており、その中の日付時刻は形式である:はこのような形式になっていないデータベースにをdatetimeオブジェクト2011-07-01 15:17:33.357

注意。それはちょうどあなたのクエリークライアントであり、あなたに白い嘘を示しています。 の番号として格納されています(実装の詳細でもあります)。なぜなら、人間は、表示された日付が40723.6371916281と同じであることを認識しないという奇妙な傾向があるからです。愚かな人間。全体を「日時」として扱うだけで問題はありません。

+0

何も戻ってきていない。 注:私はデバッガを見ているので、To.Stringは...としか言いませんでした。 しかし、私は上記のコードを実行すると、それはちょうどすべての行を取得しません。これをどのようにデバッグできますか? – Exitos

+0

@ Pete2kまあ、一致するデータはありますか?それは '>' vs '> ='の問題ですか? –

+0

更新を追加しました – Exitos

6

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

  1. SQL Server上で、私はDateTime列タイプ
  2. を使用するC#で、私は.ToString( "YYYY-MM-DD HH:MM:SS")を使用する方法

また、すべてのマシンが同じタイムゾーンで実行されていることを確認してください。

異なる結果について秒が「7月の第4回」 ...

また、第二の例もあると解釈することができますされている間、あなたの最初の例は、「7月第一」で、あなたが得るセット"4月7日"、サーバーのローカライゼーション構成に依存します(私のソリューションはこの問題を抱えていません)。

+1

'.ToString(" yyyy-MM-dd hh:mm:ss ")はあいまいさを解消する最良の方法ではありません。より良い方法は型付きのデータを渡すことであり、あいまいではありません。問題のコードは、特定の形式で 'ToString(...) 'を使用するよりも優れています。 –

+2

問題のコードが何らかの理由で機能しないため、より良い解決策は、コードを動作させ、期待される結果を提供することです。 その後、「より良い」ソリューションにさえなるものを検討するには、多くのことがあります。 – Eden

+0

私は '.ToString(yyyy-MM-ddThh:mm:ss)'を使います。どういうわけか、私はいつも何を期待するかを知っています。 TypeをSqlDateTimeに指定すると、一度は機能しませんでしたが、SQLでは「2012-01-30 10:15:30」、「2012-01-30 AM 10:15:30」は終了しました。なぜ本当にわかりません...ちょうど私の2セント – nomail

関連する問題