From 02729b234d4fae80bf898c9b785aae239a1ffe41 Mon Sep 17 00:00:00 2001 From: Rodrigo Azevedo Date: Fri, 14 Dec 2018 16:26:17 +0000 Subject: [PATCH] Fix Time value precision calculation --- .../sqlserver/type/time_value_fractional.rb | 8 ++++++-- test/cases/coerced_tests.rb | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb b/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb index 290045a9e..1a3de73d9 100644 --- a/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb +++ b/lib/active_record/connection_adapters/sqlserver/type/time_value_fractional.rb @@ -10,12 +10,16 @@ module TimeValueFractional def apply_seconds_precision(value) return value if !value.respond_to?(fractional_property) || value.send(fractional_property).zero? value.change fractional_property => seconds_precision(value) + + millis = seconds_precision(value).to_i + value = value.change fractional_property => millis % fractional_operator + value + millis / fractional_operator end def seconds_precision(value) return 0 if fractional_scale == 0 seconds = value.send(fractional_property).to_d / fractional_operator.to_d - seconds = ((seconds * (1 / fractional_precision)).round / (1 / fractional_precision)).truncate(fractional_scale) + seconds = ((seconds / fractional_precision).round * fractional_precision).round(fractional_scale) (seconds * fractional_operator).round(0).to_i end @@ -39,7 +43,7 @@ def fractional_operator end def fractional_precision - BigDecimal('0.00333') + BigDecimal('0.003333') end def fractional_scale diff --git a/test/cases/coerced_tests.rb b/test/cases/coerced_tests.rb index db7aff98f..207d0ff04 100644 --- a/test/cases/coerced_tests.rb +++ b/test/cases/coerced_tests.rb @@ -223,14 +223,14 @@ class QuoteARBaseTest < ActiveRecord::TestCase coerce_tests! :test_quote_ar_object def test_quote_ar_object_coerced value = DatetimePrimaryKey.new(id: @time) - assert_equal "'02-14-2017 12:34:56.789'", @connection.quote(value) + assert_equal "'02-14-2017 12:34:56.79'", @connection.quote(value) end # Use our date format. coerce_tests! :test_type_cast_ar_object def test_type_cast_ar_object_coerced value = DatetimePrimaryKey.new(id: @time) - assert_equal "02-14-2017 12:34:56.789", @connection.type_cast(value) + assert_equal "02-14-2017 12:34:56.79", @connection.type_cast(value) end end