Skip to content

Conversation

@metaskills
Copy link
Member

  • Automatically use datetime2 when precision is used.
  • Integration of datetime2 with type_to_sql so schema types are right.
  • New subclasses for Table and TableDefinition with overhauled column methods.
  • Fix our time fractional helpers to make datetime/datetime2 under full tests pass.
  • New coerced tests.

@metaskills metaskills merged commit 2578f0b into master Jan 5, 2017
@metaskills
Copy link
Member Author

Some raw notes while I was working this.

# BEFORE
EXEC sp_executesql N'UPDATE [sst_datatypes] SET [datetime] = @0 WHERE [sst_datatypes].[id] = @1; SELECT @@ROWCOUNT AS AffectedRows', N'@0 datetime, @1 int', @0 = '04-01-2010 12:34:56.003', @1 = 1  [["datetime", "04-01-2010 12:34:56.003"], ["id", 1]]
EXEC sp_executesql N'SELECT  [sst_datatypes].* FROM [sst_datatypes] WHERE [sst_datatypes].[id] = @0  ORDER BY [sst_datatypes].[id] ASC OFFSET 0 ROWS FETCH NEXT @1 ROWS ONLY', N'@0 int, @1 int', @0 = 1, @1 = 1  [["id", 1], ["LIMIT", 1]]
EXEC sp_executesql N'SELECT  [sst_datatypes].* FROM [sst_datatypes] WHERE [sst_datatypes].[datetime] = @0  ORDER BY [sst_datatypes].[id] ASC OFFSET 0 ROWS FETCH NEXT @1 ROWS ONLY', N'@0 datetime, @1 int', @0 = '04-01-2010 12:34:56.003', @1 = 1  [["datetime", "04-01-2010 12:34:56.003"], ["LIMIT", 1]]

# AFTER
EXEC sp_executesql N'UPDATE [sst_datatypes] SET [datetime] = @0 WHERE [sst_datatypes].[id] = @1; SELECT @@ROWCOUNT AS AffectedRows', N'@0 datetime, @1 int', @0 = '04-01-2010 12:34:56.300', @1 = 1  [["datetime", "04-01-2010 12:34:56.300"], ["id", 1]]
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION


def update_obj(obj, attr, tstring)
  sql = "UPDATE [sst_datatypes] SET [#{attr}] = '#{tstring}' WHERE [id] = #{obj.id};"
  connection.raw_connection.execute(sql).do
  sql = "SELECT [#{attr}] FROM [sst_datatypes] WHERE [id] = #{obj.id};"
  time = connection.select_value(sql)
  { usec: time.usec, nsec: time.nsec }
end

def update_obj2(obj, attr, tstring)
  c = connection.raw_connection
  sql = "UPDATE [sst_datatypes] SET [#{attr}] = '#{tstring}' WHERE [id] = #{obj.id};"
  c.execute(sql).do
  sql = "SELECT [#{attr}] FROM [sst_datatypes] WHERE [id] = #{obj.id};"
  time = c.execute(sql).each.first[attr.to_s]
  { usec: time.usec, nsec: time.nsec }
end

update_obj  obj, :datetime, '04-01-2010 12:34:56.300'
update_obj2 obj, :datetime, '04-01-2010 12:34:56.300'
=> {:usec=>300000, :nsec=>300000000}

update_obj  obj, :datetime, '01-01-1753 00:00:00.123'
update_obj2 obj, :datetime, '01-01-1753 00:00:00.123'
=> {:usec=>123000, :nsec=>123000000}

update_obj  obj, :datetime, '01-01-1753 00:00:00.003'
update_obj2 obj, :datetime, '01-01-1753 00:00:00.003'
=> {:usec=>3000, :nsec=>3000000}

c = connection.raw_connection
sql = "UPDATE [sst_datatypes] SET [datetime] = '04-01-2010 12:34:56.233' WHERE [id] = #{obj.id};"
c.execute(sql).each
sql = "UPDATE [sst_datatypes] SET [datetime] = '04-01-2010 12:34:56.234567' WHERE [id] = #{obj.id};"
c.execute(sql).each
# TinyTds::Error: Conversion failed when converting date and/or time from character string.

update_obj2 obj, :datetime2_7, '06-21-2008 13:30:00.000015'
=> {:usec=>15, :nsec=>15000}


def insert_obj(attr, tstring)
  con = @connection.raw_connection
  sql = "INSERT INTO [foos] ([#{attr}]) OUTPUT INSERTED.[id] VALUES ('#{tstring}');"
  id = con.execute(sql).each.first['id']
  sql = "SELECT [#{attr}] FROM [foos] WHERE [id] = #{id};"
  time = con.execute(sql).each.first[attr.to_s]
  { usec: time.usec, nsec: time.nsec }
end

insert_obj :created_at, '08-17-2014 12:30:00.9999'
=> {:usec=>0, :nsec=>0}
insert_obj :updated_at, '08-17-2014 12:30:00.9999'
=> {:usec=>999900, :nsec=>999900000}

c = @connection.raw_connection
c.execute("DELETE FROM [foos]").do
insert_obj :updated_at, '08-17-2014 12:30:00.9999'
=> {:usec=>999900, :nsec=>999900000}
sql = "SELECT [updated_at] FROM [foos] WHERE [updated_at] = '08-17-2014 12:30:00.9999';"
c.execute(sql).each.first['updated_at'].nsec
=> 999900000
sql = "SELECT [updated_at] FROM [foos] WHERE [updated_at] = '08-17-2014 12:30:00.999900000';"
c.execute(sql).each.first['updated_at'].nsec
=> 999900000
sql = "SELECT [updated_at] FROM [foos] WHERE [updated_at] = '08-17-2014 12:30:00.999900001';"
c.execute(sql).each.first['updated_at'].nsec
=> 999900000

@metaskills metaskills deleted the rails5-supports_datetime_with_precision branch January 15, 2017 22:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants