When comparing date-time data types SQL DataCompare first converts certain date-time data types to VARBINARY(MAX) when selecting the data int he source/destination database instead of retaining the original data types.
-- set up reproducible bug table structure and data
USE tempdb;
GO
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
GO
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[RedGateTableDATE]')
AND type IN (N'U') )
DROP TABLE dbo.RedGateTableDATE;
GO
CREATE TABLE dbo.RedGateTableDATE (RedGateTableDATEID INT IDENTITY(1, 1)
NOT NULL
, loaddateDTM2 DATETIME2 NOT NULL
, loaddateDTM DATETIME NOT NULL
, loaddateDTMO DATETIMEOFFSET NOT NULL
, loaddateSDTM SMALLDATETIME NOT NULL
, loaddateDT DATE NOT NULL
, loaddateTM TIME NOT NULL
, CONSTRAINT PK_dbo_RedGateTableDATE PRIMARY KEY CLUSTERED (RedGateTableDATEID ASC) ON [PRIMARY])
ON
[PRIMARY];
GO
DECLARE @MaxNumber INT = 1000000;
WITH Pass0
AS (SELECT 1 AS C
UNION ALL
SELECT 1) , --2 rows
Pass1
AS (SELECT 1 AS C
FROM Pass0 AS A
, Pass0 AS B) ,--4 rows
Pass2
AS (SELECT 1 AS C
FROM Pass1 AS A
, Pass1 AS B) ,--16 rows
Pass3
AS (SELECT 1 AS C
FROM Pass2 AS A
, Pass2 AS B) ,--256 rows
Pass4
AS (SELECT 1 AS C
FROM Pass3 AS A
, Pass3 AS B) ,--65536 rows
Pass5
AS (SELECT 1 AS C
FROM Pass4 AS A
, Pass4 AS B) ,--4,294,967,296 rows
Tally
AS (SELECT ROW_NUMBER() OVER (ORDER BY Pass5.C) AS Number
FROM Pass5)
INSERT INTO dbo.RedGateTableDATE
(loaddateDTM2
, loaddateDTM
, loaddateDTMO
, loaddateSDTM
, loaddateDT
, loaddateTM
)
SELECT CAST(GETDATE() AS DATETIME2) AS loaddateDTM2
, CAST(GETDATE() AS DATETIME) AS loaddateDTM
, CAST(GETDATE() AS DATETIMEOFFSET) AS loaddateDTMO
, CAST(GETDATE() AS SMALLDATETIME) AS loaddateSDTM
, CAST(GETDATE() AS DATE) AS loaddateDT
, CAST(GETDATE() AS TIME) AS loaddateTM
FROM Tally t
WHERE t.Number <= @MaxNumber;
-- display the data
SELECT TOP 100
t.RedGateTableDATEID
, t.loaddateDTM2
, t.loaddateDTM
, t.loaddateDTMO
, t.loaddateSDTM
, t.loaddateDT
, t.loaddateTM
FROM dbo.RedGateTableDATE t;
-- SELECT query run by SQL Datacompare 12.0.32.3340 - force binary collation on/off does not make a difference
SELECT RedGateTableDATEID
, CAST (loaddateDTM2 AS VARBINARY(MAX))
, loaddateDTM
, CAST (loaddateDTMO AS VARBINARY(MAX))
, loaddateSDTM
, CAST (loaddateDT AS VARBINARY(MAX))
, CAST (loaddateTM AS VARBINARY(MAX))
FROM dbo.RedGateTableDATE WITH (NOLOCK)
ORDER BY RedGateTableDATEID;
-- set up reproducible bug table structure and data USE tempdb; GO SET ANSI_NULLS, QUOTED_IDENTIFIER ON; GO IF EXISTS ( SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[RedGateTableDATE]') AND type IN (N'U') ) DROP TABLE dbo.RedGateTableDATE; GO CREATE TABLE dbo.RedGateTableDATE (RedGateTableDATEID INT IDENTITY(1, 1) NOT NULL , loaddateDTM2 DATETIME2 NOT NULL , loaddateDTM DATETIME NOT NULL , loaddateDTMO DATETIMEOFFSET NOT NULL , loaddateSDTM SMALLDATETIME NOT NULL , loaddateDT DATE NOT NULL , loaddateTM TIME NOT NULL , CONSTRAINT PK_dbo_RedGateTableDATE PRIMARY KEY CLUSTERED (RedGateTableDATEID ASC) ON [PRIMARY]) ON [PRIMARY]; GO DECLARE @MaxNumber INT = 1000000; WITH Pass0 AS (SELECT 1 AS C UNION ALL SELECT 1) , --2 rows Pass1 AS (SELECT 1 AS C FROM Pass0 AS A , Pass0 AS B) ,--4 rows Pass2 AS (SELECT 1 AS C FROM Pass1 AS A , Pass1 AS B) ,--16 rows Pass3 AS (SELECT 1 AS C FROM Pass2 AS A , Pass2 AS B) ,--256 rows Pass4 AS (SELECT 1 AS C FROM Pass3 AS A , Pass3 AS B) ,--65536 rows Pass5 AS (SELECT 1 AS C FROM Pass4 AS A , Pass4 AS B) ,--4,294,967,296 rows Tally AS (SELECT ROW_NUMBER() OVER (ORDER BY Pass5.C) AS Number FROM Pass5) INSERT INTO dbo.RedGateTableDATE (loaddateDTM2 , loaddateDTM , loaddateDTMO , loaddateSDTM , loaddateDT , loaddateTM ) SELECT CAST(GETDATE() AS DATETIME2) AS loaddateDTM2 , CAST(GETDATE() AS DATETIME) AS loaddateDTM , CAST(GETDATE() AS DATETIMEOFFSET) AS loaddateDTMO , CAST(GETDATE() AS SMALLDATETIME) AS loaddateSDTM , CAST(GETDATE() AS DATE) AS loaddateDT , CAST(GETDATE() AS TIME) AS loaddateTM FROM Tally t WHERE t.Number <= @MaxNumber; -- display the data SELECT TOP 100 t.RedGateTableDATEID , t.loaddateDTM2 , t.loaddateDTM , t.loaddateDTMO , t.loaddateSDTM , t.loaddateDT , t.loaddateTM FROM dbo.RedGateTableDATE t; -- SELECT query run by SQL Datacompare 12.0.32.3340 - force binary collation on/off does not make a difference SELECT RedGateTableDATEID , CAST (loaddateDTM2 AS VARBINARY(MAX)) , loaddateDTM , CAST (loaddateDTMO AS VARBINARY(MAX)) , loaddateSDTM , CAST (loaddateDT AS VARBINARY(MAX)) , CAST (loaddateTM AS VARBINARY(MAX)) FROM dbo.RedGateTableDATE WITH (NOLOCK) ORDER BY RedGateTableDATEID;