Why do you have a dataset like that in the first place, not good. Anyways, datastep is the best solution, sql would be complex processing.
data want;
set have;
length curr $200;
do i=1 to countc(note,"[");
curr=scan(note,i,"[");
date=scan(curr,1,"]");
name=scan(curr,2,"]");
output;
end;
run;
Note, not tested, post test data in the form of a datastep in future.