Время MYSQL округляется до ближайшего часа с использованием TIME_FORMAT, 12 часов, но неправильно применяет AM ко всему

Я округляю время до ближайшего часа, используя следующий запрос:

SELECT post_id, DeliveryDate, TIME_FORMAT(DeliveryTime, '%h:00:00 %p') AS rounded_time FROM `orders` WHERE DeliveryType='delivery' AND DeliveryDate >= CURDATE() - Interval 30 DAY ORDER BY `DeliveryDate` 

ИТ правильно округляет все, но применяет «AM» ко всем результатам, хотя большинство из них находятся в PM в db.

Вот исходные данные БД. введите здесь описание изображения Как мне заставить это правильно читать AM/PM при использовании округления, как я?

Это должно работать. Пожалуйста, предоставьте образцы данных, текущие и желаемые результаты в виде табличного текста.

GMB 11.12.2020 20:16
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

DeliveryTime столбца равно VARCHAR, поэтому сначала вы должны преобразовать его в TIME с помощью STR_TO_DATE(), а затем применить форматирование.

Если вы используете MySql 8.0, это будет работать:

SELECT TIME_FORMAT(STR_TO_DATE(DeliveryTime, '%h:%i%p'), '%h:00:00 %p') rounded_time 
FROM orders

Смотрите демо.

Если вы используете предыдущую версию, вы должны объединить часть даты с DeliveryTime, чтобы преобразовать ее в DATETIME:

SELECT TIME_FORMAT(STR_TO_DATE(CONCAT(CURRENT_DATE, ' ', DeliveryTime), '%Y-%m-%d %h:%i%p'), '%h:00:00 %p') rounded_time
FROM orders

Смотрите демо.

Обратите внимание, что этот код просто удаляет минуты из времени. На самом деле он не округляется до ближайшего часа.
Но если все ваши значения времени равны hh:00 и hh:30, то это сработает.

Большое спасибо, что исправили. Я на MYSQL 8, поэтому я принял это как ответ

theodore 11.12.2020 21:28

Другие вопросы по теме