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

Откуда: Воронеж
Сообщений: 275
Всем привет!

SQL 2005, правлю из Acess

Помогите пожалуйста с синтаксисом процедурки на добавление

Была вот такая
UPDATE      dbo.tbl_ShiftProtocol
SET               ID_Shift =
                            (SELECT      CASE WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 1200 OR
                                                      datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 480 THEN 2 ELSE 1 END AS od
                              FROM           tbl_ShiftProtocol AS od
                              WHERE       tbl_ShiftProtocol.id = od.id)


Необходимо сделать три смены вместо двух

пытаюсь написать вот так, не принимает

UPDATE      dbo.tbl_ShiftProtocol
SET               ID_Shift =
                            (SELECT      CASE WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 0 OR datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 480 THEN 3 
                                               WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 480 OR datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 960 THEN 1
                                                 ELSE 2 END AS od
                              WHERE       tbl_ShiftProtocol.id = od.id)


Как это сделать правильно?
7 апр 17, 19:05    [20379181]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1759
FROM           tbl_ShiftProtocol AS od

забыли?
7 апр 17, 19:50    [20379279]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1759
P.S. и зачем так непонятно, когда можно просто
UPDATE      dbo.tbl_ShiftProtocol
SET               ID_Shift =
                            CASE WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 0 OR datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 480 THEN 3 
                                               WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 480 OR datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 960 THEN 1
                                                 ELSE 2 END
7 апр 17, 19:52    [20379290]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Блин, точно забыл)))

Давно не занимался SQL... И так то не особо знал, а теперь и вообще забыл.

Спасибо!
7 апр 17, 19:53    [20379294]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
В логике тоже где то напортачил

Теоретически
>0 <=480 3
>480 <=960 1
>960 2

Но не работает
7 апр 17, 20:04    [20379323]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
GliderAlex
Member

Откуда: Воронеж
Сообщений: 275
Т.е. процедура то работает, но возвращает только 2 и 1, 3 смены нет, хотя значения времени между 0:00 и 8:00 есть
7 апр 17, 20:07    [20379330]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
aleks2
Guest
GliderAlex
Т.е. процедура то работает, но возвращает только 2 и 1, 3 смены нет, хотя значения времени между 0:00 и 8:00 есть


Научитесь излагать свои мысли внятно. И записывайте их без выкрутасов.

declare @dt datetime = getdate();

select Смена = case when x.[time] < '08:00' then 1 when x.[time] < '16:00' then 2 else 3 end
from ( select [time] = dateadd(dd, -datediff(dd, 0, @dt), @dt) ) as x
8 апр 17, 17:51    [20380827]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
rnk
Member

Откуда:
Сообщений: 126
X-Cite
P.S. и зачем так непонятно, когда можно просто
UPDATE      dbo.tbl_ShiftProtocol
SET               ID_Shift =
                            CASE WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 0 OR datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 480 THEN 3 
                                               WHEN datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) > 480 OR datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime) <= 960 THEN 1
                                                 ELSE 2 END

Руки чешутся пооптимизировать:
SET ID_Shift = CASE (datediff(mi, dateadd(dd, datediff(dd, 0, DateTime), 0), datetime)-1) / 480
    WHEN 0 THEN 3
    WHEN 1 THEN 1
    ELSE 2
END;
11 апр 17, 16:29    [20390299]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
rnk,
	CASE (DATEPART(hh,CAST(create_date as TIME)))/8
	WHEN 0 THEN 3
	WHEN 1 THEN 1
	ELSE 2
	END
11 апр 17, 16:58    [20390463]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
rnk
Member

Откуда:
Сообщений: 126
TaPaK
	CASE (DATEPART(hh,CAST(create_date as TIME)))/8
	WHEN 0 THEN 3
	WHEN 1 THEN 1
	ELSE 2
	END

Не покатит, если точно 8 утра, то нужно 0, а тут получается 1. Поэтому:
CASE (DATEPART(hh,CAST(create_date as TIME))-1)/8 ...
11 апр 17, 17:08    [20390502]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
rnk,

Если точно 8 то на 7
11 апр 17, 20:14    [20391248]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
rnk
Member

Откуда:
Сообщений: 126
TaPaK,

Если уж совсем быть точным, нужно, чтобы остаток (то, что подаётся на вход финальному CASE) имел такие значения:
00:00 - NOT IN (0,1)
01:00 - 0
02:00 - 0
03:00 - 0
04:00 - 0
05:00 - 0
06:00 - 0
07:00 - 0
08:00 - 0
09:00 - 1
10:00 - 1
11:00 - 1
12:00 - 1
13:00 - 1
14:00 - 1
15:00 - 1
16:00 - 1
17:00 - NOT IN (0,1)
18:00 - NOT IN (0,1)
19:00 - NOT IN (0,1)
20:00 - NOT IN (0,1)
21:00 - NOT IN (0,1)
22:00 - NOT IN (0,1)
23:00 - NOT IN (0,1)

Ваш алгоритм (если я правильно понял, ввести дополнительный CASE для 8 часов, выдавая 7) даёт сбой в 16 часов (получаем 2, а по условиям надо 1), мой удобнее и не даёт сбоя.
12 апр 17, 10:58    [20392958]     Ответить | Цитировать Сообщить модератору
 Re: Процедура на Update  [new]
aleks2
Guest
rnk
TaPaK,

Если уж совсем быть точным, нужно, чтобы остаток (то, что подаётся на вход финальному CASE) имел такие значения:
00:00 - NOT IN (0,1)
01:00 - 0
02:00 - 0
03:00 - 0
04:00 - 0
05:00 - 0
06:00 - 0
07:00 - 0
08:00 - 0
09:00 - 1
10:00 - 1
11:00 - 1
12:00 - 1
13:00 - 1
14:00 - 1
15:00 - 1
16:00 - 1
17:00 - NOT IN (0,1)
18:00 - NOT IN (0,1)
19:00 - NOT IN (0,1)
20:00 - NOT IN (0,1)
21:00 - NOT IN (0,1)
22:00 - NOT IN (0,1)
23:00 - NOT IN (0,1)

Ваш алгоритм (если я правильно понял, ввести дополнительный CASE для 8 часов, выдавая 7) даёт сбой в 16 часов (получаем 2, а по условиям надо 1), мой удобнее и не даёт сбоя.


1. За вычетом редких случаев, когда "фокусы" дают заметный выигрыш производительности, интуитивно понятная форма записи лучше любых фокусов.
2. А в ваших фокусах еще и делить надо.
12 апр 17, 11:06    [20393008]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить