Могу ли я скрыть компонент dd-mon-yyyy из Oracle SQL DATE при отображении данных и получить только формат hh: mm: ss am?

#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:

Скриншот, показывающий столбцы даты и времени в формате DD-MMM-YY

К сожалению, я работаю над 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') времени