2017-01-22 5 views
0

웹 사이트를 개발하고 있습니다. 나는 사용자로부터 입력으로 날짜를 가져 가고 있으며 입력 한 날짜에 따라 DB의 결과를 필터링합니다. 내가 직면 한 문제는 코드 숨김 (예 : 1/1/2017 12:00:00 AM)의 날짜 형식이 SQL Server의 열 형식 (예 : 2016-10-08 17 : 58 : 12.000)과 다르다는 것입니다. 첫 번째 차이점은 sql 시간은 24 시간 형식입니다. 두 번째로 C# 년/월/일은 "/"을 사용하여 구분됩니다. "s"연도 - 월 - 일은 "-"로 구분되어 있으므로 올바르게 비교되지 않습니다. 나는 양쪽에 같은 날짜 형식을 원한다. 아무도 도와 줄 수 있어요. 감사합니다형식 코드 숨김 또는 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(); 

      } 

     } 

: 당신이 DateTime 유형을 사용하는 경우에는 SQL 서버로 전송하는 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

@sDate의 시간 부분이 acceptedfordeliverytime 시간 이후이므로 아마 acceptedfordeliverytime >= @sDate이 레코드를 반환하지 않는다고 생각합니다.

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

단축 될 수 있다는 BTW

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

과 같이 SQL에서 사용 :

시도는 다음과 같이, 타임 부로서 자정과 @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 측에서 형변환 할 필요가 없습니다.

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

당신은 날짜 형식에 대한 here 자세한 내용을보실 수 있습니다 : 당신은 여전히 ​​어떤 이유를 포맷해야하는 경우, 여기에 방법이다.

+0

잘못되었습니다. .Net DateTime이 Sql Server의 DateTime에 직접 매핑되기 때문에 문자열에 날짜를 캐스팅 할 필요가 없습니다. DateTime을 매개 변수로 전달하는 것은 .Net에서 Sql 서버로 날짜를 전달하는 올바른 방법입니다. –

+0

@ ZoharPeled 네,하지만 OP에 언급 된 날짜 전에 내 대답을 썼습니다. – CodingYoshi

+0

상관 없어요. .net에서 SQL 서버로 datetime 값으로 문자열을 전달하는 것은 여전히 ​​잘못되었습니다. –