I specialize in such time-sensitive designs and here is what I do. Your second table is a Versioned
table in that, like source control systems, when the data is changed, the old data remains, just a new copy is made with the date the change was made. A small change can add full bi-temporal functionality, but that's not your question, is it? 8)
If, like I have found to be true, you notice that the overwhelming majority of the queries against this table are for current data, then one thing you may want to consider is creating a view to expose only the current version of each row.
create view tab2 as
select *
from table2 t2
where date =(
select max( date )
from table2
where name = t2.name );
Then you can simply join the first table with the view for a one-to-one correlation with the data in table1 with only the current data in table2. This allows you to abstract away the time-sensitive nature of the data.
If there are reasons you can't use a view (such as an old-school DBA who has seizures at the thought of joining with a view) then you have to write the whole thing as one query. Fortunately, that's not difficult, but abstraction is handy.
select t1.Name, t1.URL, t2.Status, t2.Date
from table1 t1
join table2 t2
on t2.Name = t1.Name
and t2.Date =(
select max( Date )
from table2
where name = t2.name );
Some DBMSs do not allow a subquery in the join. In that case, just move it to the WHERE clause:
select t1.Name, t1.URL, t2.Status, t2.Date
from table1 t1
join table2 t2
on t2.Name = t1.Name
where t2.Date =(
select max( Date )
from table2
where name = t2.name );
If Name and Date form a unique index (either defined explicitly or because they form the PK of the table), you will find performance to be much better than you might at first think. Try it and compare with alternatives.