Member 13518187 Ответов: 1

Sql-запрос с подходом к дате .


I need a Column where condition is Target_L *X / Y

where I need x and y should come automatically from query.
Y=Total Number of working days in month ,Excluding Sunday  i.e for Jan, 27 days are  working days.
X=Working days till yesterday's date i.e 23(Minus Sunday, 1 to 26 = 26-3=23)
   today is 27 january 2018 

final =<pre>Target_L
* 23/27

------------------
Есть и второй подход
X= общее количество рабочих дней, т. е. 31 января, включая воскресенье
Y=до даты окончания рабочих дней, включая воскресенье
26/31

С обеих сторон любой подход хорош для меня,мне нужен q-запрос для этого ..У меня есть столбец даты,столбец месяца.
Использование SQL SERVER

Что я уже пробовал:

новый современный подход к SQL серверу

OriginalGriff

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

Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Member 13518187

Вопрос достаточно ясен

CHill60

Очевидно, ваш вопрос недостаточно ясен, иначе кто-то ответил бы на него. Попробуйте последовать совету OriginalGriff.
Кстати...используйте ссылку ответа при ответе на комментарий

1 Ответов

Рейтинг:
0

Luca Astolfi

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


  [SqlFunction(SystemDataAccess = SystemDataAccessKind.Read)]
    public static SqlInt32 NETWORKDAYS(SqlDateTime start, SqlDateTime end, object weekend, SqlChars holidays)
    {
     
        if (start.IsNull || end.IsNull) return SqlInt32.Null;
        int sign = start <= end ? 1 : -1;
        if (start > end)
        {
            SqlDateTime tmp = start;
            start = end;
            end = tmp;
        }
        int stage1 = end.Value.Date.Subtract(start.Value.Date).Days + 1;
        int d1 = (int) GetStartWeekOffsetforMonday(start.Value.DayOfWeek);
        int d2 = (int)GetStartWeekOffsetforMonday(end.Value.DayOfWeek);
        int weekendcount;
        bool[] isweekend = GetWeekends(weekend, out weekendcount, "NETWORKDAYS");
        int remnant = (stage1 - 1) % 7;
        int stage2 = stage1 - weekendcount * (stage1 - remnant) / 7;
        for (int i = d1; i <= d1 + remnant; i++) if (isweekend[i % 7]) stage2--;
        if (holidays.IsNull) return stage2 * sign;
        List<DateTime> hols = GetHolidays(holidays, "NETWORKDAYS");
        foreach(DateTime hday in hols)
            if (!isweekend[ GetStartWeekOffsetforMonday(hday.DayOfWeek)] && hday >= start.Value.Date && hday <= end.Value.Date) stage2--;
        return stage2 * sign;
    }

private static int GetStartWeekOffsetforMonday(DayOfWeek Day)
    {

        switch (Day)
        {
            case DayOfWeek.Monday: return 0;
               
            case   DayOfWeek.Tuesday: return 1;
            case DayOfWeek.Wednesday: return 2;
            case DayOfWeek.Thursday:  return 3;
            case DayOfWeek.Friday:    return 4;
             case   DayOfWeek.Saturday:  return 5;
            case   DayOfWeek.Sunday  :    return 6;
        }
        return 0;
    }


Member 13518187

@Luca Astolfi где я должен написать эту CLR...есть только база данных sql server