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
이 문제에 대한 통찰력은 인정됩니다. 고맙습니다!