OK, let's take a shot at this. I'm going to assume, for the sake of this, that all you need is the date. If you need other information from the record with the latest date, it gets a little trickier.
There are a couple different approaches.
SELECT tblStart.datePerf AS StartDate,
tblEnd.datePerf AS EndDate,
DateDiff(d, tblStart.datePerf, tblEnd.datePerf) AS DaysOpen
FROM
(SELECT Max(table1.datePerformed) AS datePerf
FROM table1
JOIN table2
ON table1.PrimaryKey = table2.ForeignKey
WHERE table2.activityPerformed = 'The ActivityName1') tblStart
JOIN
(SELECT Max(table1.datePerformed) AS datePerf
FROM table1
JOIN table2
ON table1.PrimaryKey = table2.ForeignKey
WHERE table2.activityPerformed = 'The ActivityName2') tblEnd
This method figures the maximum values for each date in separate subqueries, performs a cross product (since there's only one record in each result, this is pretty trivial), and takes the result.
SELECT
MAX(CASE table2.activityPerformed WHEN 'The ActivityName1'
THEN table1.datePerformed ELSE '01/01/1970' END) AS StartDate,
MAX(CASE table2.activityPerformed WHEN 'The ActivityName2'
THEN table1.datePerformed ELSE '01/01/1970' END) AS EndDate,
DATEDIFF(d,
MAX(CASE table2.activityPerformed WHEN 'The ActivityName1'
THEN table1.datePerformed ELSE '01/01/1970' END),
MAX(CASE table2.activityPerformed WHEN 'The ActivityName2'
THEN table1.datePerformed ELSE '01/01/1970' END)) AS DaysOpen
FROM table1
JOIN table2
ON table1.PrimaryKey = table2.ForeignKey
This method is much better if you do want to get additional information out. But, the CASE construction can be tricky, and it's easy for bugs to sneak in.