2017-01-22 5 views
0

Я разрабатываю веб-сайт. я беру дату в качестве ввода от пользователя и в зависимости от введенной даты я фильтрую результаты из БД. Проблема, с которой я сталкиваюсь, заключается в том, что формат даты в коде позади (с 01.01.2007 12:00:00) отличается от формата столбца в sql-сервере (т. Е. 2016-10-08 17: 58: 12 000). первое различие в sql время в 24-часовом формате. 2-е место в C# год/месяц/дата разделяются с использованием «/», а в 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(); 

      } 

     } 

хранимых процедур:

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

DateTime в sql-сервере, а также в C# не сохраняет формат отображения. Измените свой вопрос, чтобы включить соответствующий код. –

ответ

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

Вам не нужно форматировать даты в формате в C#, чтобы отправить его в SQL Server, если вы используете DateTime типа. Вам не нужно указывать на стороне SQL Server, если столбец имеет тип datetime. Однако, если вам все еще нужно отформатировать его по какой-либо причине, вот как:

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

Вы можете прочитать больше о here форматов даты.

+0

Неправильно. Нет даты литья даты в строки, так как .Net DateTime отображается непосредственно на DateTime сервера Sql. передача DateTime в качестве параметра - правильный способ передачи дат с .Net на Sql-сервер. –

+0

@ ZoharPeled да, но я написал свой ответ, прежде чем OP упомянул, что они были датами с обеих сторон. – CodingYoshi

+0

Не имеет значения. По-прежнему неправильно передавать строки как значения datetime из .net в sql-сервер. –