Most of your problems seem to center around confusing a
string that
looks like a date to humans and a date object that the
computer knows is
a date.
dateFormat() returns the former and dateAdd() must have the
latter.
The parseDateTime(), LSparseDateTime() and createDate()
functions are
designed to convert the strings or numbers into date objects.
Many of
the ColdFusion date functions will also attempt to do this
for you
behind the scenes if you provide a date string in place of an
expected
date object.
When you you see things like {ts '2009-01-01
00:00:00'} that is the default output of a date object if you
have not
provided ColdFusion any other instructions on how to display
the date
information.