2012-10-10 3 views
1

내가 원인을 확인 Sql Server,하지에 C#에서 SQL 쿼리에 문제가 있어요 ....날짜 시간 변환 오류 쿼리 SQL

코드는 다음과 같습니다

SqlCommand cmd = new SqlCommand(
    "SELECT tscoc_Name, 
      tscoc_Start, 
      tscoc_End 
      FROM 
      tbl_SchedulerOnCall 
      WHERE (
       tscoc_Start > @fd 
       AND 
       tscoc_End < @ld) 
       AND 
       tscoc_Start = @state", 
    con); 
cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = 
    startDate.ToString("yyyy-MM-dd"); 
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = 
    startDate.AddDays(14).ToString("yyyy-MM-dd"); 

SQL 쿼리는 이것이다 :

exec sp_executesql 
N'SELECT tscoc_Name, 
     tscoc_Start, 
     tscoc_End 
FROM 
tbl_SchedulerOnCall 
WHERE (
    tscoc_Start > @fd 
    AND 
    tscoc_End < @ld) 
    AND 
    tscoc_Start = @state', 
N'@fd datetime, @ld datetime, @state nvarchar(2)', 
@fd = 'Oct 8 2012 12:00:00:000AM', 
@ld = 'Oct 22 2012 12:00:00:000AM', 
@state = N'SA' 

그리고 오류는 다음과 같습니다

datetime을 문자열에서 변환하는 중 구문 오류가 발생했습니다.

누구든지 무슨 일이 일어나고 있는지 알 수 있습니까?

+0

문자열의 현재 날짜 형식은 무엇입니까? –

답변

4

당신은 당신의 DateTime 값을 변환하고있는 SqlParameter에 할당 할 때 문자열 (startDate참으로 당신의 .NET 코드를 입력 DateTime입니다 가정)? 즉 완전히 쓸모없고 무의미 ... 그리고 날짜/시간, 언어 및 지역 설정에 잠재적 인 문제가 발생 - 당신이보고있는 것처럼 ...

그냥 사용

cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = startDate; 
cmd.Parameters.AddWithValue("ld", SqlDbType.DateTime).Value = startDate.AddDays(14); 

한 다음해야 벌금.

+0

네, 맞습니다. 테스트 코드였습니다. 내가 게시 한 SQL 문은 내 코드가 귀하의 코드와 동일 할 때였습니다. – GrantC

1

datetime을 매개 변수 값으로 추가하기 위해 문자열로 변환 할 필요가 없습니다. 원시 DateTime 객체 자체를 추가하기 만하면 .NET SQL 코드가 나머지 작업을 수행합니다. 무엇을위한 -

+0

동의합니다. ToString이 테스트를 위해 있었고, 제가 시도한 많은 조합에서 오류가 발생했습니다. – GrantC

0

DateTime.ParseExact. 이것은 문자열 형식으로 날짜에 대해 비표준 형식을 사용할 때 유용합니다.

string dateString = "Oct 8 2012 12:00:00:000AM"; 
    string format = "MMM dd yyyy hh:mm:ssFFFtt"; 
    CultureInfo provider = CultureInfo.InvariantCulture; 
    DateTime result = DateTime.ParseExact(dateString, format, provider); 

    cmd.Parameters.AddWithValue("fd", SqlDbType.DateTime).Value = result; 
0

AddWithValue를 사용하는? 두 번째 매개 변수는 전달하려는 값으로 이 아니고 데이터 형식입니다.

그냥 수행

SqlCommand cmd = new SqlCommand("SELECT tscoc_Name, tscoc_Start, tscoc_End FROM tbl_SchedulerOnCall WHERE (tscoc_Start > @fd AND tscoc_End < @ld) AND tscoc_Start = @state", con); 
cmd.Parameters.AddWithValue("fd", startDate); 
cmd.Parameters.AddWithValue("ld", startDate.AddDays(14)); 

문자열로 날짜 변환 일반적으로 버그를 만드는 첫 번째 단계 (로 여기)입니다.