1

我正在使用 Sinatra 编写一个将由 Android 应用程序使用的 Web 服务。Microsoft SQL Server 中使用的数据库。

存储过程调用是在 Ruby 中进行的:

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

GetTraces 存储过程返回一个包含日期时间对象的列。当服务器和客户端存在于同一时区时,将返回正确的结果。当服务器和客户端在不同的时区时,返回不正确的结果。

例如,如果我使用 2013-10-16T06:1500Z 作为开始日期,使用 2013-10-16T09:1500Z 作为结束日期,那么我应该得到该范围内的日期时间。当客户端和服务器位于不同的时区时,我得到以下信息:

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

我手动测试了存储过程,它返回了正确的结果。Ruby 中显示的结果不是存储过程返回的结果。Activerecord 和/或 Tiny tds 似乎正在错误地解析日期时间。

以下是手动执行存储过程时返回的日期时间示例:

2013-10-16 09:10:51.553

我已经用以下内容覆盖了 ActiveRecord,以解决以前从 SQL Server 解析日期时间的问题。我在网上找到了这个解决方案。

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

对此问题的任何见解表示赞赏。谢谢!

4

1 回答 1

0

我能够通过在 Windows 而不是 Linux 上运行脚本来解决这个问题。返回的日期和时间现在是正确的。

于 2013-11-14T22:39:29.847 回答