Чтобы получить общее количество рабочих часов на сервере sql, используя процедуру - PullRequest
0 голосов
/ 29 марта 2012

Сэр, моя процедура:

USE [PGATE_GITS]
GO
/****** Object:  StoredProcedure [dbo].[usp_GetTimeReport_Weekly1]    Script Date: 03/29/2012 15:14:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_GetTimeReport_Weekly1]
@pi_empId int,
--@pi_v_ep_id int,
--@pi_ep_id int, 
@pi_rptFromDate varchar(10),
@pi_rptToDate varchar(10)
AS
BEGIN
declare @si_sql VARCHAR(1000)

    SET @si_sql = 'SELECT EP_FIRST_NAME + '' '' + EP_LAST_NAME as [Employee_Name],'
    SET @si_sql = @si_sql + 'CONVERT(VARCHAR(3),CONVERT(VARCHAR(3),
                            (SUM(DATEPART(HH,CONVERT (VARCHAR,GTT_NO_OF_HOURS,108))) + (SUM(DATEPART(MI,CONVERT (VARCHAR,GTT_NO_OF_HOURS,108)))/60))))+'':''+ CONVERT(VARCHAR(2),CONVERT(VARCHAR(2),
                             SUM(DATEPART(MI,CONVERT (VARCHAR,GTT_NO_OF_HOURS,108)))- 60 * (SUM(DATEPART(MI,CONVERT(VARCHAR,GTT_NO_OF_HOURS,108)))/60))+''0'') AS [No_of_Hours] '

    --SET @si_sql = @si_sql + 'CONVERT(VARCHAR(3),CONVERT(VARCHAR(3),
 --                            (SUM(DATEPART(HH,CONVERT (VARCHAR,GTT_NO_OF_HOURS,108))) + (SUM(DATEPART(MI,CONVERT (VARCHAR,GTT_NO_OF_HOURS,108)))/60))))+'':''+ CONVERT(VARCHAR(2),CONVERT(VARCHAR(2),
 --                             SUM(DATEPART(MI,CONVERT (VARCHAR,GTT_NO_OF_HOURS,108)))- 60 * (SUM(DATEPART(MI,CONVERT(VARCHAR,GTT_NO_OF_HOURS,108)))/60))+''0'') - DATEDIFF(day,v_start_date,v_end_date)* 8 AS [twh] from PGATEINTRA.dbo.EMPLOYEE_VACATIONS '

    SET @si_sql = @si_sql + ' FROM dbo.gitsTimeTracker '
    SET @si_sql = @si_sql + ' inner JOIN dbo.vw_GetUserDetails ON gtt_gu_id = gu_id '
    SET @si_sql = @si_sql + ' inner JOIN PGATEINTRA.dbo.EMPLOYEE_VACATIONS ON V_EP_ID = EP_ID ' 
    SET @si_sql = @si_sql + ' WHERE GTT_WORK_DT BETWEEN ''' + @pi_rptFromDate + ''' AND ''' + @pi_rptToDate + ''' '

    if isnull(@pi_empId, 0) > 0 
        SET @si_sql = @si_sql + ' AND gtt_gu_id = ' + CONVERT(varchar(3), @pi_empId)

    SET @si_sql = @si_sql + ' GROUP BY [EP_FIRST_NAME], [EP_LAST_NAME] '
    print @si_sql
    exec(@si_sql)

    --Record update process ends here
    IF (@@ERROR = 0)
        return @@ERROR
    ELSE
        return 1
END

, и я получил вывод из вышеприведенной процедуры:

Employee_Name                    No_of_hours
-------------------------------------------
Aditya Sastry A                  96:00
Suresh A                         18:00
Prakash Ajjarapu                 12:40

, и я написал один оператор выбора

SELECT DATEDIFF(day,v_start_date,v_end_date)* 8 AS twh from PGATEINTRA.dbo.EMPLOYEE_VACATIONS

и я получаю вывод

twh
----
56
8
0
8
8
8
0
16
0
16
0
0
8
8
24
0
88
8
0
56
0
0
0
16
0
8
0
0
0
48
0
8
0
0
24

дело в том, что мне нужно вычесть No_of_hours из twh, и это должно быть сделано в вышеуказанной процедуре, и это должно быть показано в столбце как twh

как это сделать

1 Ответ

0 голосов
/ 29 марта 2012

Ваш код довольно неясен и труден для понимания, но общий быстрый и грязный подход, когда вам нужно объединить результаты двух «сложных» запросов, состоит в том, чтобы ВСТАВИТЬ их в временные таблицы, а затем объединить временные таблицы. Это предполагает, конечно, что вы включили некоторые подходящие значения для объединения таблиц, в этом случае похоже, что это будет какой-то идентификатор сотрудника.

Другими словами, вы должны стремиться писать что-то вроде этого:

select
    wh.employee_name,
    wh.working_hours,
    h.holiday_hours,
    wh.working_hours - h.holiday_hours as 'total_hours'
from
    #working_hours wh
    join #holidays h
    on wh.employee_id = h.employee_id

Я не думаю, что кто-то может написать запросы для вас, потому что это требует много знаний о таблицах и данных, так что это всего лишь общее предположение об одном подходе, который вы можете использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...