2016-01-13 2 views
1

Привет Я использую следующую инструкцию SQL для расчета зарплатурасчет заработной платы в SQL сервере

DECLARE @startDate DATETIME, @endDate DATETIME, @currentDate DATETIME, @currentDay INT, @PerDaycount INT, @Monthcount INT 

DECLARE @currentMonth INT, @lastDayOfStartMonth INT 
CREATE TABLE #VacationDays ([Month] VARCHAR(10), [DaysSpent] INT,[MonthDays] VARCHAR(10),[PerdayAmt] decimal(8,2),[TotalAmt] decimal(8,2)) 

DECLARE @Salary decimal(8,0) 


SET @Salary = 8000 

SET @startDate = '01/01/2015' 
SET @endDate = '12/07/2015' 
SET @currentMonth = DATEPART(mm, @startDate) 
SET @currentDay = DATEPART(dd, @startDate) 
SET @currentDate = @startDate 

WHILE @currentMonth < DATEPART(mm, @endDate) 
BEGIN 
    SELECT @lastDayOfStartMonth = 
     DATEPART(dd, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@currentDate)+1,0))) 
    PRINT @lastDayOfStartMonth 
    INSERT INTO #VacationDays 
    SELECT DATENAME(month, @currentDate) AS [Month], 
     @lastDayOfStartMonth - @currentDay + 1 AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * @lastDayOfStartMonth - @currentDay + 1 AS totamt 

    SET @currentDate = DATEADD(mm, 1, @currentDate) 
    SET @currentMonth = @currentMonth + 1 
    SET @currentDay = 1 
END 

IF DATEPART(mm, @startDate) = DATEPART(mm, @endDate) 
BEGIN 
    INSERT INTO #VacationDays 
    SELECT DATENAME(month, @endDate) AS [Month], 
     DATEPART(dd, @endDate) - DATEPART(dd, @startDate) + 1 AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * DATEPART(dd, @endDate) - DATEPART(dd, @startDate) + 1 AS totamt 
END 
ELSE 
BEGIN 
    INSERT INTO #VacationDays 
    SELECT DATENAME(month, @endDate) AS [Month], 
     DATEPART(dd, @endDate) AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * DATEPART(dd, @endDate) AS totamt 
END 

SELECT * FROM #VacationDays 
DROP TABLE #VacationDays 

вот результат:

January  31 31 258.06 8000.00 
February 28 28 285.71 8000.00 
March  31 31 258.06 8000.00 
April  30 30 266.67 8000.00 
May   31 31 258.06 8000.00 
June  30 30 266.67 8000.00 
July  31 31 258.06 8000.00 
August  31 31 258.06 8000.00 
September 30 30 266.67 8000.00 
October  31 31 258.06 8000.00 
November 30 30 266.67 8000.00 
December 7 30 266.67 1866.67 

проблема несколько раз MonthDays пришедшего неправильно, как в примере дес. имеет 31 день, но получает 30 дней.

Как это решить.

Начальная дата и дата окончания могут быть изменены согласно требованию.

ответ

1

Привет вы можете использовать этот запрос.

DECLARE @startDate DATETIME, @endDate DATETIME, @currentDate DATETIME, @currentDay INT, @PerDaycount INT, @Monthcount INT 

    DECLARE @currentMonth INT, @lastDayOfStartMonth INT 
    CREATE TABLE #VacationDays ([Month] VARCHAR(10), [DaysSpent] INT,[MonthDays] VARCHAR(10),[PerdayAmt] decimal(8,2),[TotalAmt] decimal(8,2)) 

DECLARE @Salary decimal(8,0) 


SET @Salary = 8000 

SET @startDate = '01/01/2015' 
    SET @endDate = '12/07/2015' 
    SET @currentMonth = DATEPART(mm, @startDate) 
SET @currentDay = DATEPART(dd, @startDate) 
SET @currentDate = @startDate 

WHILE @currentMonth <= DATEPART(mm, @endDate) 
BEGIN 
    SELECT @lastDayOfStartMonth = 
    DATEPART(dd, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@currentDate)+1,0))) 
PRINT @lastDayOfStartMonth 
IF(@currentMonth != DATEPART(mm, @endDate)) 
BEGIN 
INSERT INTO #VacationDays 
SELECT DATENAME(month, @currentDate) AS [Month], 
    @lastDayOfStartMonth - @currentDay + 1 AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * @lastDayOfStartMonth - @currentDay + 1 AS totamt 
END 
ELSE 
BEGIN 
INSERT INTO #VacationDays 
    SELECT DATENAME(month, @endDate) AS [Month], 
    DATEPART(dd, @endDate) AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * DATEPART(dd, @endDate) AS totamt 
END 
SET @currentDate = DATEADD(mm, 1, @currentDate) 
SET @currentMonth = @currentMonth + 1 
SET @currentDay = 1 
END 

SELECT * FROM #VacationDays 
DROP TABLE #VacationDays 

его немного модифицировано.

Здесь изменения как в комментарии ниже

Измененные состояния В то время как

WHILE @currentMonth <= DATEPART(mm, @endDate) 

Поскольку @lastDayOfStartMonth это было вычислено внутри цикла. А за декабрьский месяц он не меняется и собирает данные ноябрьского месяца, который равен 30. Поэтому я изменил его, чтобы получить правильные данные внутри самого цикла while.

+1

Можете ли вы, пожалуйста, также * объяснить *, что вы сделали/изменили? * Это немного изменено * действительно не очень полезно - вам нужно сказать ** ЧТО ** было изменено - и почему –

+0

я изменил условие While 'WHILE @currentMonth <= DATEPART (mm, @endDate)' потому что @ lastDayOfStartMonth вычисляется внутри цикла while. А за декабрьский месяц он не меняется и собирает данные ноябрьского месяца, который равен 30. Поэтому я изменил его, чтобы получить правильные данные внутри самого цикла while. - пожалуйста, проверьте – Viplock

+0

@marc_s ли решение и объяснение сработали для вас? – Viplock

1

Пожалуйста, пересчитать месяц день после того, как во время выполнения цикла, потому что ваш цикл, а не включать в прошлом месяце, Добавьте эту строку после того, как в то время как петля

SELECT @lastDayOfStartMonth = 
    DATEPART(dd, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@currentDate)+1,0))) 
1
DECLARE @startDate DATETIME, @endDate DATETIME, @currentDate DATETIME, @currentDay INT, @PerDaycount INT, @Monthcount INT 

DECLARE @currentMonth INT, @lastDayOfStartMonth INT 
CREATE TABLE #VacationDays ([Month] VARCHAR(10), [DaysSpent] INT,[MonthDays] VARCHAR(10),[PerdayAmt] decimal(8,2),[TotalAmt] decimal(8,2)) 

DECLARE @Salary decimal(8,0) 


SET @Salary = 8000 

SET @startDate = '01/01/2015' 
SET @endDate = '12/07/2015' 
SET @currentMonth = DATEPART(mm, @startDate) 
SET @currentDay = DATEPART(dd, @startDate) 
SET @currentDate = @startDate 

WHILE @currentMonth <= DATEPART(mm, @endDate) 
BEGIN 
SELECT @lastDayOfStartMonth = 
    DATEPART(dd, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@currentDate)+1,0))) 
PRINT @lastDayOfStartMonth 
INSERT INTO #VacationDays 
SELECT DATENAME(month, @currentDate) AS [Month], 
    @lastDayOfStartMonth - @currentDay + 1 AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * @lastDayOfStartMonth - @currentDay + 1 AS totamt 

SET @currentDate = DATEADD(mm, 1, @currentDate) 
SET @currentMonth = @currentMonth + 1 
SET @currentDay = 1 
END 

    IF DATEPART(mm, @startDate) = DATEPART(mm, @endDate) 
    BEGIN 
    INSERT INTO #VacationDays 
    SELECT DATENAME(month, @endDate) AS [Month], 
    DATEPART(dd, @endDate) - DATEPART(dd, @startDate) + 1 AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * DATEPART(dd, @endDate) - DATEPART(dd, @startDate) + 1 AS totamt 
END 
ELSE 
BEGIN 
    INSERT INTO #VacationDays 
    SELECT DATENAME(month, @endDate) AS [Month], 
    DATEPART(dd, @endDate) AS [DaysSpent],@lastDayOfStartMonth as a,@Salary/@lastDayOfStartMonth As dayammt,(@Salary/@lastDayOfStartMonth) * DATEPART(dd, @endDate) AS totamt 
END 
    SELECT * FROM #VacationDays 
    DROP TABLE #VacationDays 

Попробуйте этот код ... И проверьте вывод и не выберите последнюю строку из вывода, независимо от того, что возвращается из этого запроса.

+0

Не могли бы вы также * объяснить *, что вы сделали/изменили? Не просто сбрасывайте свой код - сообщите нам, что вы делаете, чтобы достичь результата! –

+0

WHILE @currentMonth ** <= ** DATEPART (мм, @endDate) –

Смежные вопросы