#sql #sql-server
#sql #sql-сервер
Вопрос:
Пытаюсь составить отчет, в котором сотруднику необходимо отработать 30 рабочих дней с момента последнего пункта. Я хотел бы каким-то образом показать что-либо с 8.0 в качестве рабочего дня. Таким образом, столбец std_01_04 будет отображаться как 12/04/2020 и как рабочий день.
База данных sql настроена очень глупо, и у нее возникают проблемы с извлечением из нее.
- существует столбец с именем yr, данные показывают текущий год «2020»
- существует столбец с именем mth_cal, показывающий текущий месяц «12» за декабрь.
Сложная часть — это день. Столбец std_01_15 последние 2 числа — это день месяца, этот пример — 15-й. Данные в этом столбце будут равны 0 или 8. 8 означает, что они работали (полный день) или 0, что означает выходной / праздничный день. Итак, мне нужно извлечь данные из нескольких мест, чтобы установить дату, и мне нужно определить 30 рабочих дней с момента последней точки. Любая помощь была бы отличной.
Редактировать: это было разработано другой компанией. У меня нет возможности изменить это. Я могу только попытаться работать с ним. Или мне нужно вручную вводить все праздничные / выходные дни
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты.
2. Какой беспорядок. Динамический SQL может вам помочь, но это потребует некоторой работы.
3. Похоже, исправление дизайна — это то, что вам действительно нужно сделать.
4. Может быть полезно отключить данные, чтобы получить даты и часы, отработанные в строках, для решения некоторых проблем с дизайном. docs.microsoft.com/en-us/sql/t-sql/queries /…
Ответ №1:
Вы можете создать процедуру или функцию хранения с входными параметрами @year и @month с помощью приведенного ниже кода, чтобы получить весь день с 8,0 рабочими часами.
declare @year int = 2020
declare @month int = 11
create table #temp (workingDay date)
declare @index int = 1
declare @query nvarchar(200)
declare @paramdef nvarchar(300) = '@valOut nvarchar(10) OUTPUT'
declare @value nvarchar(10)
while @index <= 30
begin
set @query = 'select @valOut = STD_01_' REPLACE(STR(@index, 2), SPACE(1), '0') ' from work where yr=' CAST(@year as nvarchar(4));
exec sp_executesql @query, @paramdef, @valOut = @value output
if @value = '8.0'
begin
insert into #temp values(CAST(@year as nvarchar(4)) REPLACE(STR(@month 1, 2), SPACE(1), '0') REPLACE(STR(@index, 2), SPACE(1), '0'))
end
set @index = @index 1
end
select * from #temp
drop table #temp
Комментарии:
1. Это работает потрясающе, спасибо! Мне просто нужно выяснить, как ввести дату и посмотреть, сколько дней прошло после этого. Пример. 30 рабочих дней после 11-25-2020 — это какой день.
Ответ №2:
Я думаю, вам нужны результаты, подобные приведенным ниже. Вы можете использовать unpivot
в sql server.
Я протестировал приведенный ниже запрос.
Create table TestUnpivot(yr int , mnth int, std_01_01 int, std_01_02 int, std_01_03 int, primary key(yr,mnth) )
go
Insert into TestUnpivot values(2019,12,0,8,8),(2020,1,8,0,8),(2020,2,8,8,8)
go
Select * from TestUnpivot
go
Select Yr,Mnth, workd, dayss, Convert(Varchar(2),Mnth) '/' right(dayss,2) '/' convert(Varchar(4),Yr) as DT
from
(
select * from TestUnpivot
)p
unpivot
(
workd for dayss in (std_01_01,std_01_02,std_01_03)
) as unp
go