More fun with stats, with timed durations thrown in...and 4 alternate solutions. All four of the new ones are a few milliseconds faster but the results vary from run to run. I also threw in am itvf that measures the total duration of each.
IF OBJECT_ID('dbo.table1') IS NOT NULL
DROP TABLE dbo.table1;
IF OBJECT_ID('dbo.table2') IS NOT NULL
DROP TABLE dbo.table2;
IF OBJECT_ID('dbo.tallytest') IS NOT NULL
DROP TABLE dbo.tallytest;
CREATE TABLE dbo.table1 (id int primary key, [date] date not null);
CREATE TABLE dbo.table2 (id int primary key, [date] date not null);
CREATE TABLE dbo.tallytest (n int primary key);
;WITH
L0(c) AS(SELECT 1 UNION ALL SELECT 1 AS O), -- 2 rows
L1(c) AS(SELECT 1 FROM L0 [A] CROSS JOIN L0 ), -- 4 rows
L2(c) AS(SELECT 1 FROM L1 [A] CROSS JOIN L1 ) , -- 16 rows
L3(c) AS(SELECT 1 FROM L2 [A] CROSS JOIN L2 ), -- 256 rows
L4(c) AS(SELECT 1 FROM L3 [A] CROSS JOIN L3 ), -- 65,536 rows
L5(c) AS(SELECT 1 FROM L4 [A] CROSS JOIN L4 ), -- 4,294,967,296 rows
tallytest_cte AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n FROM L5)
INSERT INTO tallytest
SELECT n FROM tallytest_cte WHERE n<=1000000;
INSERT INTO table1
SELECT n,
CAST(
DATEADD(day,DATEDIFF(day,0,GETDATE())- 1 - FLOOR(RAND(CAST(NEWID() AS binary(4)))*365.25*90),0) AS date)
FROM tallytest
INSERT INTO table2
SELECT n,
CAST(
DATEADD(day,DATEDIFF(day,0,GETDATE())- 1 - FLOOR(RAND(CAST(NEWID() AS binary(4)))*365.25*90),0) AS date)
FROM tallytest
--SELECT * FROM table1;
--SELECT * FROM table2;
IF OBJECT_ID('dbo.itvfCalculateDurationInMilliseconds') IS NOT NULL
DROP FUNCTION dbo.itvfCalculateDurationInMilliseconds
GO
CREATE FUNCTION dbo.itvfCalculateDurationInMilliseconds
(
@StartDate DATETIME2
,@EndDate DATETIME2
)
RETURNS TABLE
AS
RETURN
(
/* Original script by Tab Alleman, MSDN Forums 6/23/2011 */
SELECT
(
--DATE Portion in millseconds
CAST(
DATEDIFF(dd
, DATEADD(dd, DATEDIFF(dd, 0, @StartDate), 0) --@StartDate Date portion
, DATEADD(dd, DATEDIFF(dd, 0, @EndDate), 0) --@EndDate Date portion
)
AS decimal(19,0))
* 24 --hrs in day
* 60 --minutes in hour
* 60 --seconds in minute
* 1000 --ms in second
) --difference in milleseconds of Date Portions
+
(
--TIME portion in millseconds
CAST(
DATEDIFF(ms
, DATEADD(dd, -DATEDIFF(dd, 0, @StartDate), @StartDate) --@StartDate Time portion
, DATEADD(dd, -DATEDIFF(dd, 0, @EndDate), @EndDate) --@EndDate Time portion
)
AS decimal(19,0))
) AS Duration
)
GO
/***************************************************************/
SET NOCOUNT ON
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
dbcc freeproccache
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Michael''s Solution';
SET @StartDate = GETDATE()
select top 1
@MaxDate = a.[Date]
from
(
select top 1 b.[Date] from table1 b order by b.[Date] desc
union
select top 1 c.[Date] from table2 c order by c.[Date] desc
) a
order by
a.[Date] desc;
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Michael''s Solution' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
DBCC freeproccache
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Alan''s Solution';
SET @StartDate = GETDATE()
SELECT
@MaxDate = MAX([date])
FROM
(
SELECT [date] FROM table1
UNION
SELECT [date] FROM table2
) r
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Alan''s Solution' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
DBCC freeproccache;
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Dwain''s Solution';
SET @StartDate = GETDATE()
;
WITH T1(d1)
AS (
SELECT
MAX([date])
FROM
table1
),
T2(d2)
AS (
SELECT
MAX([date])
FROM
table2
)
SELECT
@MaxDate = CASE WHEN d1 > d2 THEN d1
ELSE d2
END
FROM
(
SELECT d1= (SELECT d1 FROM T1),d2= (SELECT d2 FROM T2)
) a ;
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Dwain''s Solution' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
DBCC freeproccache;
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Steven''s Solution1';
SET @StartDate = GETDATE()
SELECT TOP(1)
@MaxDate = MaxDate
FROM
(
SELECT TOP(1) MAX([Date]) AS MaxDate FROM table1 AS t1
WHERE ID > 0
UNION
SELECT TOP(1) MAX([Date]) AS MaxDate FROM table2 AS t2
WHERE ID > 0
) r
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Steven''s Solution1' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
DBCC freeproccache;
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Steven''s Solution2';
SET @StartDate = GETDATE()
SELECT
@MaxDate = MaxDate
FROM
(
SELECT MAX([Date]) AS MaxDate FROM table1 AS t1
WHERE ID > 0
INTERSECT
SELECT MAX([Date]) AS MaxDate FROM table2 AS t2
WHERE ID > 0
) r
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Steven''s Solution2' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
DBCC freeproccache;
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Steven''s Solution3';
SET @StartDate = GETDATE()
SELECT
@MaxDate = MaxDate
FROM
(
SELECT TOP(1)
MaxDate,
DateRank = RANK() OVER (ORDER BY MaxDate)
FROM
(
SELECT MAX([Date]) AS MaxDate FROM table1 AS t1
WHERE ID > 0
INTERSECT
SELECT MAX([Date]) AS MaxDate FROM table2 AS t2
WHERE ID > 0
) r
) r1;
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Steven''s Solution3' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO
DECLARE
@StartDate DATETIME2(7),
@EndDate DATETIME2(7),
@MaxDate DATE
DBCC freeproccache;
SET STATISTICS TIME ON;
SET STATISTICS IO ON;
PRINT 'Steven''s Solution4';
SET @StartDate = GETDATE()
SELECT
@MaxDate = MaxDate
FROM
(
SELECT MAX([Date]) AS MaxDate FROM table1 AS t1
WHERE ID > 0
INTERSECT
SELECT MAX([Date]) AS MaxDate FROM table2 AS t2
WHERE ID > 0
) r
SET @EndDate = GETDATE()
PRINT '=================================================================';
SET STATISTICS TIME OFF;
SET STATISTICS IO OFF;
SELECT 'Steven''s Solution4' AS Title, @MaxDate AS MaxDate, Duration FROM dbo.itvfCalculateDurationInMilliseconds(@StartDate,@EndDate)
GO