cómo seleccionar filas según el rango de fechas cuando a veces el rango de fechas puede tener valores nulos (seleccionar todas las filas)
Tengo una tabla llamada Proyecto (id, nombre, fecha_certificación); el id es int, el nombre es varchar(250) y la fecha_certificación es la marca de tiempo.
Cuando se inserta un proyecto, solo se insertan la identificación y el nombre, pero la fecha_certificación es nula. Más tarde, el usuario puede certificar el proyecto, luego la fila se actualiza con la fecha_certificación con la fecha en que el usuario certifica el proyecto. Entonces, en la tabla del proyecto, puedo tener algunas filas con la fecha de certificación como nula y algunas con una fecha (por ejemplo, 2020-06-18 00:12:07)
Ahora tengo una consulta de búsqueda con nombre y tengo un filtro de fecha de inicio y fecha de finalización para filtrar la fecha de certificación. a continuación se muestra la consulta del Repositorio con la firma completa.
@Query(value = "select distinct p.id, p.name, p.certification_date from project p WHERE (LOWER(p.name) LIKE CONCAT('%',LOWER(:searchKey),'%') and ((cast(:startDate as timestamp) is null or p.CERTIFICATION_DATE >= :startDate) AND (cast(:endDate as timestamp) is null or p.CERTIFICATION_DATE < :endDate ))", nativeQuery = true) public List<Object[]> searchProjects(@Param("searchKey") String searchKey, @Param("startDate") Date startDate, @Param("endDate") Date endDate);Entonces, cuando searchProjects() se ejecuta con todos los valores, devuelve los resultados correctamente. Pero cuando no necesito filtros de fecha, es decir, startDate y endDate son nulos, falla. (aquí no tenemos ningún problema con searchKey porque si searchKey es nulo, paso "" para que devuelva todos los valores)
La excepción es
org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to timestamp without time zoneEntonces, ¿qué debo hacer para que startDate y endDate sean opcionales, de modo que si esas fechas no se pasan simplemente devuelvan todas las filas (ya sea que la fecha de certificación sea nula o tenga algunos valores)?
También probé muchas soluciones de Stackoverflow pero no me funcionan.
@Query(value = "select distinct p.id, p.name, p.certification_date from project p " + "where LOWER(p.name) LIKE CONCAT('%',LOWER(:searchKey),'%') " + "and (cast(cast(:startDate as text) as timestamp) is null or p.CERTIFICATION_DATE >= :startDate) " + "and (cast(cast(:endDate as text) as timestamp) is null or p.CERTIFICATION_DATE < :endDate)", nativeQuery = true) public List<Object[]> searchProjects(@Param("searchKey") String searchKey, @Param("startDate") Date startDate, @Param("endDate") Date endDate);class Employee { int id; Date birthDate; } List<Employee> findByBirthDateNotNullAndBirthDateLessThanEqualAndBirthDateGreaterThanEqual(Date startDate,Date endDate)