With MyCTE (TheTime)AS( SELECT convert(datetime2,'1900-01-01 0:12:14.1241234') UNION ALL SELECT '1900-01-01 0:08:16.361' UNION ALL SELECT '1900-01-01 0:08:57.705' ) SELECT * From myCTE
SourceTable { ID identity int, StartTime datetime2(7), EndTime datetime2(7), SomeField1 int, SomeField2 varchar(128), SomeField3 double}DestinationTable { ID identity int, TimeSpan time(7), SomeField1 int, SomeField2 varchar(128), SomeField3 double}SourceTable (data):ID StartTime EndTime SomeField1 SomeField2 SomeField3 1 2012-04-26 13:53:43.0000000 2012-04-26 13:54:44.5448951 1234 dummytext1 9853.12354 2 2012-10-01 12:00:00.0130952 2012-10-01 17:00:04.9845083 24778 dummytext2 325.0The above table data needs to be processed so that it becomes the below expected destination data:DestinationTable (data):ID TimeSpan SomeField1 SomeField2 SomeField3 1 00:01:01.5448951 1234 dummytext1 9853.12354 2 05:00:04.9714131 24778 dummytext2 325.0
With MyCTE (TheTime)AS( SELECT convert(datetime2,'1900-01-01 0:08:00.0000001') UNION ALL SELECT '1900-01-01 0:09:18.361' UNION ALL SELECT '1900-01-01 0:13:50.705' )SELECT *, CAST(f.q AS TIME(7))From myCTE a1CROSS JOIN myCTE a2CROSS APPLY (SELECT s_difference = DATEDIFF(second,a1.TheTime, a2.TheTime)) aCROSS APPLY (SELECT aTime = DATEADD(second,s_difference,a1.TheTime)) bCROSS APPLY (SELECT nsFraction = DATEDIFF(ns,aTime,a2.TheTime)) cCROSS APPLY (SELECT tt = DATEADD(second,s_difference,0)) dCROSS APPLY (SELECT t = CONVERT(VARCHAR(8),tt,108)) eCROSS APPLY (SELECT q = e.t + '.' + CAST(nsFraction AS VARCHAR)) fWHERE a1.TheTime < a2.TheTime
With MyCTE (TheTime)AS( SELECT convert(datetime2,'1900-01-01 00:08:33.580') UNION ALL SELECT '1900-01-01 00:08:32.579' UNION ALL SELECT '1900-01-01 00:08:32.581' UNION ALL SELECT '1900-01-01 00:09:18.361' UNION ALL SELECT '1900-01-01 00:13:50.705' )SELECT *, CAST(f.q AS TIME(7))From myCTE a1CROSS JOIN myCTE a2CROSS APPLY (SELECT s_difference = DATEDIFF(second,a1.TheTime, a2.TheTime)) aCROSS APPLY (SELECT aTime = DATEADD(second,s_difference,a1.TheTime)) bCROSS APPLY (SELECT nsFraction = DATEDIFF(ns,aTime,a2.TheTime)) cCROSS APPLY (SELECT tt = DATEADD(second,s_difference,0)) dCROSS APPLY (SELECT t = CONVERT(VARCHAR(8),tt,108)) eCROSS APPLY (SELECT q = case when nsfraction < 0 then e.t + '.' + CAST(1000000000 + nsFraction AS VARCHAR) when nsfraction < 10 then e.t + '.00000000' + CAST(nsFraction AS VARCHAR) when nsfraction < 100 then e.t + '.0000000' + CAST(nsFraction AS VARCHAR) when nsfraction < 1000 then e.t + '.000000' + CAST(nsFraction AS VARCHAR) when nsfraction < 10000 then e.t + '.00000' + CAST(nsFraction AS VARCHAR) when nsfraction < 100000 then e.t + '.0000' + CAST(nsFraction AS VARCHAR) when nsfraction < 1000000 then e.t + '.000' + CAST(nsFraction AS VARCHAR) when nsfraction < 10000000 then e.t + '.00' + CAST(nsFraction AS VARCHAR) when nsfraction < 100000000 then e.t + '.0' + CAST(nsFraction AS VARCHAR) else e.t + '.' + CAST(nsFraction AS VARCHAR) end) fWHERE a1.TheTime < a2.TheTime
With MyCTE (aTime, bTime)AS( SELECT convert(datetime2,'1900-01-01 00:08:00.0000001'), convert(datetime2,'1900-01-01 00:09:18.361') UNION ALL SELECT '1900-01-01 00:08:00.0000001', '1900-01-01 00:13:50.705' UNION ALL SELECT '1900-01-01 00:09:18.361', '1900-01-01 03:13:50.7050001' UNION ALL SELECT '1900-01-01 23:09:18.361', '1900-01-02 02:13:50.7050001' UNION ALL SELECT '1900-01-01 00:00:00.000000111', '1900-01-01 00:00:00.000000222')SELECT *, CAST(f.q AS TIME(7))From myCTE a1CROSS APPLY (SELECT s_difference = DATEDIFF(second,aTime, bTime)) aCROSS APPLY (SELECT axTime = DATEADD(second,s_difference,aTime)) bCROSS APPLY (SELECT nsFraction = DATEDIFF(ns,axTime,bTime)) cCROSS APPLY (SELECT tt = DATEADD(second,s_difference,0)) dCROSS APPLY (SELECT t = CONVERT(VARCHAR(8),tt,108)) eCROSS APPLY (SELECT q = e.t + '.' + RIGHT('000000000'+CAST(DATEDIFF(ns,DATEADD(second,s_difference,aTime),bTime) AS VARCHAR),9)) f
With MyCTE (aTime, bTime)AS( SELECT convert(datetime2,'1900-01-01 00:08:00.0000001'), convert(datetime2,'1900-01-01 00:09:18.361') UNION ALL SELECT '1900-01-01 00:08:00.0000001', '1900-01-01 00:13:50.705' UNION ALL SELECT '1900-01-01 00:09:18.361', '1900-01-01 03:13:50.7050001' UNION ALL SELECT '1900-01-01 23:09:18.361', '1900-01-02 02:13:50.7050001' UNION ALL SELECT '1900-01-01 00:00:00.000000111', '1900-01-01 00:00:00.000000222')SELECT aTime, bTime, Result = CAST(f.q AS TIME(7)), SimpleProof = DATEADD(ms,DATEDIFF(ms,aTime, bTime),CAST(CAST(0 AS DATETIME) AS DATETIME2))From myCTE a1CROSS APPLY (SELECT s_difference = DATEDIFF(second,aTime, bTime)) aCROSS APPLY ( SELECT q = CONVERT(VARCHAR(8),DATEADD(second,s_difference,0),108) + '.' + RIGHT('000000000'+CAST(DATEDIFF(ns,DATEADD(second,s_difference,aTime),bTime) AS VARCHAR),9)) f;