2013-10-30 1 views
1

Android 애플리케이션에서 사용하게 될 Sinatra를 사용하여 웹 서비스를 작성하고 있습니다. Microsoft SQL Server에서 사용되는 데이터베이스입니다. SQL Server의 Datetimes가 Ruby에서 잘못 구문 분석되었습니다.

저장 프로 시저 호출

루비로 이루어지고 :

sql = "exec GetTraces '#{id}', '#{start_date}', '#{end_date}'" 
result = ConnectionManager.connection.select_all(sql) 

GetTraces 저장된 프로 시저 DateTime 개체를 포함하는 열을 반환한다. 동일한 시간대에 서버와 클라이언트가 있으면 올바른 결과가 반환됩니다. 서버와 클라이언트가 다른 시간대에있을 때 잘못된 결과가 반환됩니다.

예를 들어 2013-10-16T06 : 1500Z을 시작일로 사용하고 2013-10-16T09 : 1500Z를 종료일로 사용하는 경우 해당 기간 내에서 날짜 시간을 가져야합니다. 클라이언트와 서버가 서로 다른 시간대에있을 때 다음을 얻습니다.

2013-04-09T00:03:11+00:00 

수동으로 저장 프로 시저를 테스트하고 올바른 결과를 반환합니다. 루비에 표시된 결과는 저장 프로 시저에서 반환되는 결과가 아닙니다. Activerecord 및/또는 Tiny tds가 날짜 시간을 잘못 파싱하는 것 같습니다.

2013-10-16 09:10:51.553 

나는 SQL 서버에서 구문 분석 날짜 시간과 이전 문제를 해결하기 위해 다음과 같이 액티브을 재정의 : 여기

저장 프로 시저를 수동으로 실행될 때 반환되는 날짜의 예입니다. 이 솔루션을 온라인에서 찾았습니다.

module ActiveRecord 
    module ConnectionAdapters 
    class ColumnWithIdentity 
     def cast_to_time(value) 
     return value if value.is_a?(Time) or value.is_a?(DateTime) 
     time_array = ParseDate.parsedate(value) 
     time_array[0] ||= 2000 
     time_array[1] ||= 1 
     time_array[2] ||= 1 
     Time.send(Base.default_timezone, *time_array) rescue DateTime.new(*time_array[0..5]) rescue nil 
     end 

     def cast_to_datetime(value) 
     if value.is_a?(Time) or value.is_a?(DateTime) 
      if value.year != 0 and value.month != 0 and value.day != 0 
      return value 
      else 
      return Time.mktime(2000, 1, 1, value.hour, value.min, value.sec) rescue nil 
      end 
     end 
     return cast_to_time(value) if value.is_a?(Date) or value.is_a?(String) rescue nil 
     value 
     end 
    end 
    end 
end 

이 문제에 대한 통찰력은 인정됩니다. 고맙습니다!

답변

0

Linux 대신 Windows에서 스크립트를 실행하여이 문제를 해결할 수있었습니다. 반환 된 날짜와 시간이 이제 정확합니다.