A side by side merge does this efficiently. Basically you just take the same dataset 3 times, but two of those times chop off the first or first two rows with FIRSTOBS (so it starts at row 2 or row 3). You use rename so the variables don't overwrite each other, and there you go.
The merge without a BY statement is called a side-by-side merge, and just takes a row from each dataset, then moves onto the next row of each dataset.
data have;
input date $ var12 var41;
datalines;
2013M8 -25.6 -30
2013M9 -24.5 -27.3
2013M10 -26.4 -25.7
2013M11 -32.6 -29.2
2013M12 -30.7 -27.3
2014M01 -29.2 -30.3
;;;;
run;
data want;
merge have(rename=(var12=var12_t2 var41=var41_t2) in=h1)
have(firstobs=2 rename=(var12=var12_t1 var41=var41_t1) in=h2)
have(firstobs=3 rename=(var12=var12_t0 var41=var41_t0) in=h3);
if h1 and h2 and h3;
run;
If you have a BY group (like an ID) you may need to manipulate it some to make that work.