#sql #oracle #datetime
#sql #Oracle #дата и время
Вопрос:
Я вставляю данные в таблицу SQL. Мне нужно было разделить столбцы для даты и времени. Я определил его как:
CREATE TABLE Appointment (
"Date" DATE,
"Time" DATE);
а затем я вставил значения:
INSERT INTO Appointment VALUES ('10/Jan/2020', to_date('9:00:00 AM','hh:mi:ss am');
INSERT INTO Appointment VALUES ('15/Feb/2020', to_date('10:00:00 AM','hh:mi:ss am');
Однако, когда я попытался отобразить значения, все значения «Time» были равны «1-Dec-2020», но сортировка по «Времени» работала правильно. Могу ли я скрыть это «dd-mon-yyyy» от отображения или удалить его из набора данных?
Вот как отображается вывод, я хочу видеть свой формат hh: mm: ss am:
К сожалению, я работаю над Oracle SQL, поэтому я не могу использовать функцию ВРЕМЕНИ.
Комментарии:
1. О чем
TO_CHAR("Date", 'hh:mi:ss am')
?2. У меня его нет в одном столбце, у меня есть два отдельных столбца с датой dd-mon-yyyy, а другой с hh: mi: ss am. Я предполагаю, что SQL предположил, что sysdate необходимо вставить для этих значений hh: mi: ss am, поэтому я не могу получить правильный вывод из запроса.
Ответ №1:
Вы можете сделать это с помощью строк и проверить ограничения:
CREATE TABLE Appointment (
"Date" DATE,
"Time" VARCHAR2(8),
CHECK chk_appointment_date (date = trunc(date)),
CHECK chk_appointment_time (regexp_like(time, '^[0-2][0-9]-[0-1][0-9]-[0-5][0-9]')
);
В противном случае просто поместите значения в один столбец и сгенерируйте значения части даты:
create table appointment (
date_time date,
the_date date generated always as (trunc(date_time)) virtual,
the_time varchar(8) generated always (to_char(date_time, 'HH24:MI:SS'))
)
Комментарии:
1. Виртуальные столбцы выполнили свою работу. Если я хочу заказать по the_time, тогда я применяю to_date(the_time,»hh: mm: ss am»), и это работает!
Ответ №2:
Очень плохая идея хранить дату / время в виде строк — не делайте этого!
Используйте правильный DATE
тип данных и форматируйте выходные данные в соответствии с вашими потребностями (или используйте ВИРТУАЛЬНЫЙ столбец, как предложил Гордон):
CREATE TABLE Appointment ( DateTime DATE);
INSERT INTO Appointment VALUES
(to_date('10/Jan/2020 9:00:00 AM','dd/Mon/YYYY hh:mi:ss am', 'nls_date_language = american'));
INSERT INTO Appointment VALUES
(to_date('15/Feb/2020 10:00:00 AM','dd/Mon/YYYY hh:mi:ss am', 'nls_date_language = american'));
SELECT TO_CHAR(DateTime, 'hh:mi:ss am')
from Appointment;
Комментарии:
1. Есть ли какой-либо способ сохранить их в отдельных столбцах? Например, если я хочу ЗАКАЗАТЬ назначение ПО hh: mi: ss, не заботясь о компоненте dd-mon-yyyy?
2. Использовать
ORDER BY TO_CHAR(DateTime, 'hh24:mi:ss')
или виртуальный столбец
Ответ №3:
Могу ли я скрыть это «dd-mon-yyyy» от отображения
Да, вы можете скрыть это. Я бы посоветовал не использовать TIME
столбец отдельно, он встроен в дату в oracle. но если это требуется для вас, вам нужно использовать TO_CHAR
следующее:
SELECT "Date", TO_CHAR("Time",'hh:mi:ss AM') from your_table;
Я бы создал единственный столбец в таблице с типом данных date и, когда это необходимо, я могу использовать TO_CHAR(DATECOLUMN, 'DD-MON-YYYY')
для даты и TO_CHAR(DATECOLUMN, 'hh:mi:ss AM')
времени