#sql #sql-server #replace #set
#sql #sql-сервер #заменить #установите
Вопрос:
У нас есть таблица с символом (5), в которую вставлены данные, подобные 6:45, 10:15, 3:00. Наши рабочие часы с 6 до 3 вечера … и в эту таблицу не включены am / pm -a, поскольку это char (5) …. Я не могу изменить таблицу, мне нужно ежедневно изменять данные после загрузки. Все загружаемые данные имеют формат x: xx или xx: xx.
Да, они «должны» конвертировать перед загрузкой таблицы, но это не так. Как я могу войти и «исправить» записи… изменение 6:00,7:00,8:00,9:00, чтобы иметь 06,07,08,09 (начальный ноль) и изменить 1, 2, 3, 4, 5, начиная с номера до 13,14,15,16 с сохранением остальной части: xx части данных?
Комментарии:
1. Вот почему нам нужно использовать proper
datatype
. Вы должны использоватьTIME
тип данных2. @prdp . , , Хотя то, что вы говорите, верно, преобразование во время не даст правильного ответа.
3. @GordonLinoff но это упростило бы получение желаемого результата во время запроса.
4. @Prdp … да, я согласен с вами … но я не создавал базу данных и не могу вносить изменения в типы данных… Я могу иметь дело только с тем, что у меня есть, и предложить поставщику внести эти изменения в свою базу данных.
Ответ №1:
Предполагая, что у вас никогда не было данных между 1 и 5 часами ночи, и вы можете с уверенностью предположить, что к этим значениям нужно добавить 12 часов … затем вы можете преобразовать в тип ВРЕМЕНИ, оценить значение ЧАСА и добавить 12 только тогда, когда оно находится между 1 и 5 — и преобразовать все это обратно в символ (5) для обновления.
DECLARE @Sample TABLE (badTime CHAR(5))
INSERT INTO @Sample(badTime)
VALUES ('6:45'),
('07:45'),
('8:45'),
('9:45'),
('10:45'),
('11:45'),
('12:45'),
('1:45'),
('2:45'),
('3:45'),
(null),
('')
SELECT *, CONVERT(VARCHAR(5),CASE WHEN DATEPART(HH,CONVERT(TIME,badTime)) BETWEEN 1 AND 5 THEN DATEADD(HH,12,CONVERT(TIME,badTime)) ELSE CONVERT(TIME,badTime) END,108)
-- UPDATE S SET badTime = CONVERT(VARCHAR(5),CASE WHEN DATEPART(HH,CONVERT(TIME,badTime)) BETWEEN 1 AND 5 THEN DATEADD(HH,12,CONVERT(TIME,badTime)) ELSE CONVERT(TIME,badTime) END,108)
FROM @Sample S
WHERE badTime IS NOT NULL AND badTime!=''
AND ISDATE(badTime)=1
Комментарии:
1. Это обновление отлично работает!!! НО …. одна крошечная вещь …. для строк с нулевыми данными обновление вставляет 00:00, а затем в графическом интерфейсе это выглядит как 12 утра … как бы я не вставлял данные для нулевых полей?
2. Добавить:
WHERE badTime IS NOT NULL AND badTime !=''
И / ИЛИWHERE ISDATE(badTime)=1
Ответ №2:
Одним из методов является case
. Для указанных вами значений:
select (case when col like '[6789]:%' then stuff(col, 1, 1, '0' left(col, 1)
when col like '[12345]:%' then stuff(col, 1, 1, cast(left(col, 1) 12 as char(2))
else col
end)
Если у вас есть некоторые данные, начинающиеся с нуля:
select (case when col like '[6789]:%' then stuff(col, 1, 1, '0' left(col, 1)
when col like '[12345]:%' then stuff(col, 1, 1, cast(left(col, 1) 12 as char(2))
when col like '0[12345]:%' then stuff(col, 1, 2, cast(left(col, 2) 12 as char(2))
else col
end)
И преобразование в тип данных time использует аналогичную логику:
select (case when hour(cast(col as time)) in (6, 7, 8, 9)
then cast(col as time)
when hour(cast(col as time) in (1, 2, 3, 4, 5)
then dateadd(hour, 12, cast(col as time))
else cast(col as time)
end)
Комментарии:
1. Эти инструкции не будут обновляться … но изменят результат… Мне нужно изменить данные в таблице на xx: xx … Я попытался заменить пример # 1, чтобы увидеть результат … но я получаю сообщение об ошибке при вводе моей таблицы / столбца. 🙁 ` select (CASE WHEN rt.stop_time like ‘[6789]:%’ THEN STUFF (rt.stop_time, 1, 1, ‘0’ left(rt.stop_time, 1) КОГДА rt.stop_time, например, ‘[12345]:%’, ЗАТЕМ ВВЕДИТЕ (rt.stop_time, 1, 1, приведите (слева (rt.stop_time, 1) 12 как символ (2)) ИНАЧЕ rt.stop_time END) из passport_travel rt, где RT. ID = 1118874454 `
2. @KAT . . . A
select
легко заменяется на обновление. В вашем первоначальном вопросе не было ясно, что вы хотите изменить таблицу.3. @GordonLinoff … это правда…. В следующий раз я буду более ясен… Я ценю всю помощь! SQL — одна из моих многочисленных шляп @ work, и я все еще учусь …. большое спасибо 🙂