Las instrucciones BEGIN/END se usan en el caso de rutinas almacenadas que tienen más de una sentencia. No son obligatorias para crearlas si son sentencias únicas, y por eso no te da error al omitirlas
en este caso.
Ahora bien, por buenas prácticas es conveniente usarlas, pero como son son sentencias de SQL normales, no se pueden dejar abiertas, y cerrar las sentencias con ";" genera un error.
Cuando se usa BEGIN/END, debe realizarse un cambio de delimitador de sentencias momentáneo, cosa que se puede realizar por interfaz, o por consola, según sea el modo en que estés cargando el código en cuestión. Para eso existe el comando DELIMITER.
Si usas el editor de rutinas de MySQL Workbench, no deberías tener problemas, porque esa interfaz pone internamente (transparente para ti), los comandos DELIMITER correspondientes.
Si lo realizas por phpMyadmin, debes indicar el delimitador de sentencias en un textbox para ello.
SI lo haces por consola, o por script, debes hacerlo a mano...
El código quedaría así:
Código MySQL:
Ver original#Cambia el delimitador momentaneamente
DELIMITER $$
empre.nombre_razonsocial,
e.fecha,
CONCAT(p.Apellidos
,' - ',p.Nombres
) Nombres
, p.Documento,
e.fecha_Entrada,
e.fecha_Salida_Almuerzo,
e.fecha_Entrada_Almuerzo,
TIMEDIFF(e.fecha_Entrada_Almuerzo,e.fecha_Salida_Almuerzo) Total_Receso,
e.fecha_Salida Salida_Laboral,
TIMEDIFF(e.fecha_Salida,e.fecha_Entrada) Total_Labor,
e.Fecha_Ultimo_Registro Ultima_Marcacion
INNER JOIN empresas empre
ON empre.id_empresa
= ps.id_empresa
#Restaura el delimitador
DELIMITER ;