2017-01-22 48 views
0

我正在開發一個網站。我將日期作爲用戶的輸入,並根據輸入的日期來篩選數據庫的結果。我面臨的問題是代碼後面的日期格式(即1/1/2017/2017 12:00:00 AM)與sql服務器中的列格式不同(即2016-10-08 17:58:12000)。第一個區別是在SQL時間是24小時格式第二在C#年/月/日期使用「/」分隔,而在SQL年 - 月 - 日期之間被「 - 」分開,這就是爲什麼它沒有正確比較。我希望雙方的日期格式相同。任何人都可以幫忙由於格式日期代碼後面或sql服務器

編輯

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(); 

      } 

     } 

存儲過程:

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對象比較S' – McNets

+0

在兩側都是日期類型dateTime –

+1

在sql server中以及在c#中的DateTime不存儲顯示格式。請修改您的問題以包含相關的代碼。 –

回答

0

我猜acceptedfordeliverytime >= @sDate沒有記錄,可能是因爲@sDate的時間部分在acceptedfordeliverytime的時間部分之後。

嘗試與午夜時間部分通過@sDate,像這樣:

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

順便說一句,即可以縮短到

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

,並用它在這樣的SQL:

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

謝謝你,但抱歉抱歉說它沒有工作。:( –

+0

你仍然沒有得到任何結果嗎? –

+0

沒有。讀者沒有收到任何數據。這可能是與日期參數不匹配的情況下 –

0

你不應該需要的,如果你正在使用DateTime類型,日期格式轉換成C#中的格式將其發送到SQL Server。如果列的類型爲datetime,則不需要在SQL Server端進行轉換。但是,如果你還需要對其進行格式化無論出於何種原因,這裏是如何:

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

你可以閱讀更多關於here日期格式。

+0

錯誤。由於.Net DateTime直接映射到Sql Server的日期時間,所以沒有將日期轉換爲字符串的時間。將DateTime作爲參數傳遞是將.Net中的日期傳遞給Sql服務器的正確方法。 –

+0

@ZoharPared是的,但我在OP之前寫過我的回答提到他們是雙方的日期。 – CodingYoshi

+0

沒關係。將字符串作爲日期時間值從.net傳遞到SQL Server仍然是錯誤的。 –