2017-01-22 9 views
0

私はウェブサイトを開発中です。私はユーザーからの入力として日付をとっており、入力された日付に応じてDBから結果をフィルタリングします。私が直面している問題は、コードの背後にある日付の形式(つまり、1/1/2017 12:00:00 AM)がSQL Serverの列の形式(2016-10-08 17:58:12.000)と異なることです。最初の違いはsqlの時間は24時間形式ですc#年/月/日の2番目は "/"を使用して区切られていますが、sql year-month-dateは " - "で区切られているため、正しく比較されません。私は両方の側で日付の同じ形式が欲しい。誰でも助けることができます。おかげ形式コードの日付またはSQLサーバーの日付

EDITストアド・プロシージャ

protected void searchRecords(DateTime startDate, DateTime finishDate, DateTime startTime, DateTime finishTime, String receiver) { 
      SqlConnection connection = new SqlConnection(connectionString); 
      SqlCommand command = new SqlCommand("SP_GetRecords", connection); 
      command.CommandType = CommandType.StoredProcedure; 
      SqlParameter sDate = new SqlParameter("@sDate", SqlDbType.DateTime); 
      sDate.Value = startDate; 
      sDate.Direction = ParameterDirection.Input; 
      command.Parameters.Add(sDate); 
      SqlParameter fDate = new SqlParameter("@fDate", SqlDbType.DateTime); 
      fDate.Value = finishDate; 
      fDate.Direction = ParameterDirection.Input; 
      command.Parameters.Add(fDate); 
      SqlParameter sTime = new SqlParameter("@sTime", SqlDbType.DateTime); 
      sTime.Value = startTime; 
      sTime.Direction = ParameterDirection.Input; 
      command.Parameters.Add(sTime); 
      SqlParameter fTime = new SqlParameter("@fTime", SqlDbType.DateTime); 
      fTime.Value = finishTime; 
      fTime.Direction = ParameterDirection.Input; 
      command.Parameters.Add(fTime); 
      SqlParameter rcvr = new SqlParameter("@rcvr", SqlDbType.NVarChar, 50); 
      rcvr.Value = receiver; 
      rcvr.Direction = ParameterDirection.Input; 
      command.Parameters.Add(rcvr); 
      SqlDataReader reader; 
      try 
      { 
       connection.Open(); 

       // String resultMessage = command.Parameters["@sDate"].Value.ToString(); 

       reader = command.ExecuteReader(); 

       while (reader.Read()) 
       { 
        lblreport.Text = reader["username"].ToString(); 
       } 

      } 
      catch (SqlException e) 
      { 
       lblreport.Text = e.Message; 
      } 
      finally 
      { 
       connection.Close(); 

      } 

     } 

:あなたはDateTimeタイプを使用している場合は、SQL Serverに送信するためにC#での形式に日付の書式を設定する必要はありません

ALTER PROCEDURE [dbo].[SP_GetRecords] 
    -- Add the parameters for the stored procedure here 
    @sDate dateTime, 
    @fDate dateTime, 
    @sTime dateTime, 
    @fTime dateTime, 
    @rcvr nvarchar(50) 
AS 
BEGIN 

declare @sql nvarchar(max); 
declare @startDate datetime; 
set @startDate = CONVERT(datetime,@sDate); 
set @sql ='select * from outbox where 1=1 '; 
    if(@sDate is not null) 
     set @sql = @sql + 'and acceptedfordeliverytime >= @sDate '; 
    if(@rcvr is not null) 
     set @sql = @sql + ' and [email protected]'; 
    Declare @params nvarchar(500) 
    SELECT @params ='@sDate DateTime,'+ 
        '@fDate DateTime,'+ 
        '@sTime DateTime,'+ 
        '@fTime DateTime,'+ 
        '@rcvr nvarchar(50)' 

    exec sp_executesql @sql, @params,@sDate,@fDate,@sTime,@fTime,@rcvr 
+1

文字列変数を使用しない限り、同じフォーマットは必要ありません。また、DateTimeオブジェクト? – McNets

+0

両側の日付はdateTimeタイプ –

+1

です。SQL ServerのDateTimeとC#では、表示形式は格納されません。関連するコードを含めるように質問を編集してください。 –

答えて

0

acceptedfordeliverytime >= @sDateは、おそらく@sDateの時間部分がacceptedfordeliverytimeの時間部分の後であるため、レコードが返されないと推測しています。

command.Parameters.Add("@sDate", SqlDbType.DateTime).Value = startDate.Date; 

に短縮し、このようなSQLで使用することができる、BTW

SqlParameter sDate = new SqlParameter("@sDate", SqlDbType.DateTime); 
sDate.Value = startDate.Date; 
sDate.Direction = ParameterDirection.Input; 
command.Parameters.Add(sDate); 

このように、時間部分として真夜中と @sDateを渡す

試し

if(@sTime is not null) 
    set @sql = @sql + 'and acceptedfordeliverytime >= @sDate and acceptedfordeliverytime < dateadd(day, 1, @sDate) '; 
+0

ありがとうございます。 –

+0

あなたはまだ結果が戻っていませんか? –

+0

いいえ読者はデータを受け取りません。日付パラメータ –

0

。列がdatetimeの場合は、SQL Server側でキャストする必要はありません。あなたは、日付のフォーマットについてhere詳細を読むことができ

var readyForSql = someDate.ToString("yyyy-MM-dd HH:mm:ss.fff"); 

:あなたはまだどのような理由のためにそれをフォーマットする必要がある場合は、ここではどのようです。

+0

間違っています。 .Net DateTimeはSql ServerのDateTimeに直接マップされるため、文字列に日付をキャストする点はありません。 DateTimeをパラメータとして渡すことは、.NetからSqlサーバーに日付を渡す正しい方法です。 –

+0

@ZoharPeledはい、私はOPの前に自分の答えを書きました。 – CodingYoshi

+0

問題ではありません。 .netからSQL Serverへのdatetime値として文字列を渡すのはまだ間違っています。 –