установка временного диапазона в SQL Developer - PullRequest
0 голосов
/ 28 апреля 2020

Я работаю над набором данных, который содержит информацию о дорожно-транспортных происшествиях и времени их возникновения. (набор данных существует в SQL Сервер под именем ДТП ).

У меня есть столбец в формате date. Я хотел бы извлечь время из колонки. Затем добавьте новый столбец с именем lightining_period, отметьте время как днем ​​ или ночью . Моя проблема в том, чтобы установить диапазон времени, так как я получаю неправильную метку каждый раз, когда запускаю код.

Различные периоды освещения (дневное время: 6 утра - 5:59 вечера и ночное время 6 вечера - 5:59 утра).

[1] Сначала я написал этот код, чтобы извлечь время от accident_date_time и сохраните его в новом столбце time.

create table lightiningPeriod as 
select to_char(accident_date_time,'HH:MMAM') as time
from accident.accident;

[2] Затем я изменил таблицу, добавив столбец lightining_label, в котором я хочу хранить метки днем ​​/ ночью .

alter table lightiningPeriod add (
lightining_label varchar2(20)
);

[3] Наконец, я использовал оператор Update, чтобы изменить значения lightining_label в соответствии с диапазонами time. Но таблицы выходят не так. Я пытался использовать между , to_date , cast , convert , но ни один из них не работал.

update lightiningPeriod
set lightining_label='daytime'
where time >= '06:00AM'
and time <= '5:59PM';

ниже приведен пример вывода, который показывает неправильные метки.

time    lightining_label
06:04AM daytime
11:04AM daytime
01:04AM (null)
10:04AM daytime
10:04AM daytime
04:04PM (null)
07:04PM daytime
01:04PM (null)

Ответы [ 3 ]

1 голос
/ 28 апреля 2020

Это твик в ответе Себастьяна. На сервере SQL вы можете использовать вычисляемый столбец:

ALTER TABLE lightiningPeriod
  ADD lightining_label AS (CASE WHEN CONVERT(TIME, [time]) >= CONVERT(TIME, '06:00:00') AND CONVERT(TIME, [time]) < CONVERT(TIME, '18:00:00')
                                THEN 'daytime' ELSE 'nighttime'
                           END)

Затем метка вычисляется при запросе к таблице, поэтому она всегда верна.

1 голос
/ 28 апреля 2020

Похоже, что столбец time использует строковый тип (VARCHAR, NVARCHAR) вместо TIME. Таким образом, вы сравниваете строковые значения вместо значений времени.

Вы можете использовать следующее, используя CONVERT для сравнения строковых значений, таких как значения времени:

UPDATE lightiningPeriod
  SET lightining_label = CASE WHEN CONVERT(TIME, [time]) BETWEEN CONVERT(TIME, '06:00AM') AND CONVERT(TIME, '5:59PM') THEN 'daytime' ELSE 'nighttime' END

демонстрация на dbfiddle.uk

Рекомендую сохранять значения времени в столбце, используя TIME тип данных .

0 голосов
/ 29 апреля 2020

Спасибо всем, я решил запрос следующим образом:

update lightiningPeriod
set lightining_label='daytime'
where to_char(accident_date_time, 'hh24:mi') >= '06:00'
and to_char(accident_date_time, 'hh24:mi') <= '17:59';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...