🗓 Будьте осторожны с датами



with new_table as (

select

patient_id

, first_name

, last_name

, time(birth_date, '+1 second') as birth_date



from patients

where TRUE

and patient_id = 1



UNION



select

patient_id

, first_name

, last_name

, birth_date



from patients

WHERE TRUE

and patient_id != 1

)



select

birth_date



from new_table

where TRUE

and birth_date between '1953-12-05' and '1953-12-06'




В этой базе данных все даты сокращены до дня. Это означает, что все значения времени столбца Birthday_date в этом примере равны 00:00:00. Однако в реальных наборах данных это обычно не так.



В зависимости от среды разработки SQL ваши настройки могут скрыть отображение времени. Но то, что время скрыто, не означает, что оно не является частью данных.



В приведенном выше примере я искусственно добавил секунду к пациенту №1. Как видите, этой 1-й секунды было достаточно, чтобы исключить пациента из результатов при использовании ключевого слова BETWEEN.



Еще один распространенный пример, который чаще всего упускают из вида специалисты по работе с данными, — это присоединение к датам, в которых все еще есть временной компонент. В большинстве случаев они действительно пытаются присоединиться к столбцам с сокращенной датой и, в конечном итоге, не получают желаемого результата или, что еще хуже, они не осознают, что получили неправильный результат.