Take that NSQL, paste it into a query in the application - you will get the same error, so its nothing to do with XOG.
The problem is just with your NSQL, these lines are all wrong
,@Select:DIM:USER_DEF:IMPLIED:PRJ1:srm_projects.ID:ID@
,@Select:srm_projects.NAME:NAME@
,@Select:srm_projects.LAST_UPDATED_DATE:LAST_UPDATED_DATE_FILTER@
,@Select:to_char(srm_projects.LAST_UPDATED_DATE, 'HH24:MI:SS.FF3'):LAST_UPDATED_DATE@
,@Select:to_char(srm_projects.CREATED_DATE, 'HH24:MI:SS.FF3'):CREATED_DATE@
they should be more like;
,@Select:DIM_PROP:USER_DEF:IMPLIED:PRJ:srm_projects.ID:ID@
,@Select:DIM_PROP:USER_DEF:IMPLIED:PRJ:srm_projects.NAME:NAME@
,@Select:DIM_PROP:USER_DEF:IMPLIED:PRJ:srm_projects.LAST_UPDATED_DATE:LAST_UPDATED_DATE_FILTER@
,@Select:DIM_PROP:USER_DEF:IMPLIED:PRJ:to_char(srm_projects.LAST_UPDATED_DATE, 'HH\:24\:MI\:SS.FF3'):LAST_UPDATED_DATE@
,@Select:DIM_PROP:USER_DEF:IMPLIED:PRJ:to_char(srm_projects.CREATED_DATE, 'HH24\:MI\:SS.FF3'):CREATED_DATE@
(you have just got confused about how you define query dimensions and properties, perhaps getting confused with the syntax we need to use for creating lookups as well)
Also, personally I would NOT cast the date/time fields to strings either ; leave them as dates and handle any conversion in the downstream usage of the query.