Я помогаю нашим заводам получать информацию из баз данных для ежедневхых митингов. Нужно чтобы они видели кто как работал в предыдущий день, какие проблемы были с машинами, и т.д. Мы используем программу, которая называется Factivity для ввода данных в ERP. Factivity отправляет все данные в SQL database и народ использует query для получения данныв в Excel.
Данные нужны только за предыдущий день. Query выглядит так:
FROM Factivity.dbo.Employee Employee
WHERE (Employee.Site='SG690') AND (Employee.Date=(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))
Работает отлично со вторника по пятницу. В понедельник естественно выдаёт данные за воскресенье, т.к. по воскресеньям на заводах работают несколько человек и вводят каие-нибудь данные а большинство машин простаивает. Мне же нужно чтобы в понедельник загружались данные за пятницу, а ещё лучше чтобы за три дня, с пятницы по воскресенье.
Можно ли написать какое-то логическое выражение чтобы работало по разному в зависимости ото дня недели?
Сложный вопрос по SQL
-
- Уже с Приветом
- Posts: 9277
- Joined: 11 Jul 2000 09:01
- Location: 28277
-
- Уже с Приветом
- Posts: 900
- Joined: 24 Apr 2014 15:10
Re: Сложный вопрос по SQL
Можно, есть такая функция WEEKDAY. Можно написать CASE в зависимости от ее результата.
Правда, по Вашему кусочку не очень понятно, где там ее применять.
Правда, по Вашему кусочку не очень понятно, где там ее применять.
-
- Уже с Приветом
- Posts: 9277
- Joined: 11 Jul 2000 09:01
- Location: 28277
Re: Сложный вопрос по SQL
Там свё просто:
max(date) -- самый последний день с данными. Т.е логически выгладеть должно так:
... AND (Employee.Date=
IF TODAY WEEKDAY =/= MONDAY
(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))
ELSE
(date>getdate()-3 )
ENDIF
Я не программист и не знаю SQL, поможете перевести?
Code: Select all
SELECT Employee.Site, Employee.Date, Employee.Emp, Employee."Order", Employee.Part, Employee.Part_desc, Employee.Seq, Employee.Ord_qty, Employee.Std_setup, Employee.Std_Run, Employee.Stat, Employee.Setup_hours, Employee.Setup_Code, Employee.Run_hours, Employee.Prob_Hours, Employee.Prob_Code, Employee.Good, Employee.Scrap, Employee.Scrap_Code, Employee.Std_Count, Employee.Scrap_code_Desc
FROM Factivity.dbo.Employee Employee
WHERE (Employee.Site='SG690') AND (Employee.Date=(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))
... AND (Employee.Date=
IF TODAY WEEKDAY =/= MONDAY
(select max(date) from Factivity.dbo.order_oee where site = 'sg690'))
ELSE
(date>getdate()-3 )
ENDIF
Я не программист и не знаю SQL, поможете перевести?
IL
-
- Уже с Приветом
- Posts: 900
- Joined: 24 Apr 2014 15:10
Re: Сложный вопрос по SQL
Я, вообще-то, поклонник SARG in Where clauses, поэтому то, что я буду писать, мне не очень нравится, но Вы можете это использовать.
Я попробовала WEEKDAY и, похоже, это не стандартный T-SQL, не сработал для меня.
Но вот это будет работать:
AND Date > GETDATE() - (CASE WHEN DATEPART(DW, GETDATE()) = 2 THEN 3 ELSE 1 END)
Я попробовала WEEKDAY и, похоже, это не стандартный T-SQL, не сработал для меня.
Но вот это будет работать:
AND Date > GETDATE() - (CASE WHEN DATEPART(DW, GETDATE()) = 2 THEN 3 ELSE 1 END)
-
- Уже с Приветом
- Posts: 9277
- Joined: 11 Jul 2000 09:01
- Location: 28277
-
- Уже с Приветом
- Posts: 900
- Joined: 24 Apr 2014 15:10
Re: Сложный вопрос по SQL
Да, имейте ввиду, что getdate() returns datetime datatype, т.е. если ваша загрузка происходит в 12 дня, то все, что было до 12 в предыдущий день не будет рассматриваться. Вам, наверно, надо делать CAST или CONVERT to date datatype, чтобы получить правильный набор. Но это все в зависимости от того, что конкретно делается. Если нужна с этим помощь, пишите в личку.
-
- Уже с Приветом
- Posts: 9277
- Joined: 11 Jul 2000 09:01
- Location: 28277
Re: Сложный вопрос по SQL
Мне нужно 24 часа до последнего обновления, т.е. должно быть всё ОК.
Работает отлично, я поменял 2 на 6 (тяпница) и получил данные за три дня.
Большое спасибо!
Работает отлично, я поменял 2 на 6 (тяпница) и получил данные за три дня.
Большое спасибо!
IL