Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменение времени в дате согласно условию.  [new]
PavelSLK
Member

Откуда:
Сообщений: 1
Добрый день, Друзья!

Необходима Ваша помощь в решении задачи. Есть большая таблица одно из полей которой содержит данные в формате DateTime. Необходимо написать такой update, который будет работать по следующему условию: Если время, указанное в этом столбце > 18:30, то оно изменяется на 09:30, а день увеличивается на 1. Совсем высшим пилотажем было бы еще выходные исключить, но пока и изменение времени не получается =(
Может кто-нибудь знает как реализовать такую идею?
25 июл 11, 16:07    [11023838]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
PavelSLK, посмотрите функции CASE, DATEADD
25 июл 11, 16:12    [11023863]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
UPDATE [Большая таблица]
SET [столбец]=DATEADD(HOUR,15,[столбец])
WHERE CONVERT(CHAR(5),[столбец],108)>'18:30'
  AND DATEDIFF(DAY,0,[столбец])%7 NOT IN(5,6);
25 июл 11, 16:20    [11023898]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Это если выходные - суббота и воскресенье.
Если это перенесённые выходные или праздники какие-нибудь,
то используйте таблицу-календарь в JOINе
25 июл 11, 16:21    [11023912]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
UPDATE [Большая таблица]
SET [столбец]=DATEADD(HOUR,15,[столбец])
WHERE CONVERT(CHAR(5),[столбец],108)>'18:30'
  AND DATEDIFF(DAY,0,[столбец])%7 NOT IN(5,6);
Извините, упустил из виду, что надо присвоить одно и то же время следующего дня
UPDATE [Большая таблица]
SET [столбец]=CONVERT(CHAR(8), DATEADD(DAY,1,[столбец]),112)+' 09:30'
WHERE CONVERT(CHAR(5),[столбец],108)>'18:30'
  AND DATEDIFF(DAY,0,[столбец])%7 NOT IN(5,6);
25 июл 11, 16:31    [11023970]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
Raoul
Member

Откуда:
Сообщений: 177
iap, боюсь, так тормозить будет, конвертирование в строку довольно затратно, да и ненадежно, кто его знает, какая там локаль.

я бы так сделал:
SET DATEFIRST 1; -- чтобы не было разнобоя

...

UPDATE mytable
  SET mydate = DATEADD(n,2010 + -- 2010 = сутки + 9:30
    CASE DATEPART(dw,mydate) -- проверяем день недели
      WHEN 5 then 2880 -- если пятница, добавляем двое суток
      WHEN 6 then 1440 -- если суббота - сутки
      ELSE 0
    END
    ,DATEADD(d,0,DATEDIFF(d,0,mydate))) -- удаляем временнУю компоненту даты
  WHERE 60*HOUR(mydate) + MINUTE(mydate) > 1110; -- если больше 18:30

Кстати, если время в поле меньше 9:30 (например, полвосьмого), то, наверное, тоже нужно выставить время в 9:30, запрос будет аналогичен, даже попроще.
25 июл 11, 16:55    [11024146]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
Raoul
Member

Откуда:
Сообщений: 177
В предпоследней строчке
,DATEADD(d,DATEDIFF(d,0,mydate)),0)
25 июл 11, 17:01    [11024177]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Raoul
кто его знает, какая там локаль.
Зачем это знать? Не понял.
Raoul
я бы так сделал:
 WHERE 60*HOUR(mydate) + MINUTE(mydate) > 1110; -- если больше 18:30
Вот это, значит, тормозить не будет? А почему?
Raoul
Кстати, если время в поле меньше 9:30 (например, полвосьмого), то, наверное, тоже нужно выставить время в 9:30, запрос будет аналогичен, даже попроще.
В условии сказано "время, указанное в столбце, > 18:30".
Зачем додумывать? 07:30 < 18:30, как я думаю.
25 июл 11, 17:13    [11024252]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
Raoul
Member

Откуда:
Сообщений: 177
iap
Raoul
кто его знает, какая там локаль.
Зачем это знать? Не понял.

Стормозил, у вас в CONVERT все локали прописаны явно.

iap
Raoul
я бы так сделал:
WHERE 60*HOUR(mydate) + MINUTE(mydate) > 1110
; -- если больше 18:30[/src]
Вот это, значит, тормозить не будет? А почему?

Потому что это целочисленная арифметика, которая по определению быстрее строковых операций.

Протестировал на 20000000 записях (точнее, в цикле), мой запрос отработал 25 секунд, ваш - 36.

Заодно обнаружил ошибку и у вас, и у себя.
У вас:
DATEDIFF(DAY,0,@mydate)%7 NOT IN(5,6)
- таким образом вы узнаёте остаток отделения дня месяца на 7, но никак не день недели.

У себя:
-- Неправильно
HOUR(@mydate) + MINUTE(n,@mydate) > 1110

-- Правильно
60*DATEPART(hh,@mydate) + DATEPART(n,@mydate) > 1110


iap
Raoul
Кстати, если время в поле меньше 9:30 (например, полвосьмого), то, наверное, тоже нужно выставить время в 9:30, запрос будет аналогичен, даже попроще.
В условии сказано "время, указанное в столбце, > 18:30".
Зачем додумывать? 07:30 < 18:30, как я думаю.

Будет странно, если запись, сделанная вчера в 7 вечера, окажется более "поздней", чем запись, сделанная сегодня в 7:30 утра
25 июл 11, 17:40    [11024494]     Ответить | Цитировать Сообщить модератору
 Re: Изменение времени в дате согласно условию.  [new]
Raoul
Member

Откуда:
Сообщений: 177
DATEDIFF(DAY,0,@mydate)%7 NOT IN(5,6)
А, ну да, сорри, DATEDIFF корректно будет работать, правда, 0 - понедельник.
25 июл 11, 17:44    [11024540]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить