Cuando haces uniones necesitas alias. Por lo que veo, y entiendo, tu pretendes algo como:
SELECT Sub.Desde, Sub.hasta, Sub.Empresa FROM( SELECT fechadesde1 AS desde, fechahasta1 AS Hasta, Empresa1 AS Empresa FROM tabla1 WHERE fechahasta1 BETWEEN :fecha1 AND :fecha2 UNION ALL SELECT fechadesde2 AS desde, fechahasta2 AS Hasta, Empresa2 AS Empresa FROM tabla2 WHERE fechahasta2 BETWEEN :fecha1 AND :fecha2 UNION ALL SELECT fechadesde3 AS desde, fechahasta3 AS Hasta, Empresa3 AS Empresa FROM tabla3 WHERE fechahasta3 BETWEEN :fecha1 AND :fecha2 ) AS Sub ORDER BY hasta
Observa como si bien cada subconjunto que se va a unir tiene diferentes campos, todos comparten el mismo alias. Esto es fundamental cuando uno va a hacer unión. ¡Los campos deben conservar el mismo nombre!
Además, no es lo mismo hacer un order by fechahasta3 dentro de la unión. ¿No será que quieres ordenar el conjunto ya con el union? Si es así:
1) Armas tu conjunto de datos con las uniones
2) Luego ordenas
Y para esto se recomiendo hacerlo por subconsulta, observa como la subconsulta trae el conjunto y ordeno en la consulta maestra refenciando por el campo alias.
Admito que no he probado la consulta SQL propiamente en mi motor, pero debería de andar.
Saludos,