Welcome to Sign in | Help
in Search

date saptaminale

Last post 08-18-2009, 10:27 AM by ignatandrei. 2 replies.
Sort Posts: Previous Next
  •  08-17-2009, 2:53 PM 7505

    date saptaminale

    Buna,
    Am o problema : o tabela cu date, pe sql 2005, cu ,  sa zicem , zilele de concediu : DataInceput, DataSfirsit, Persoana .
    As vrea sa obtin - facind cit mai putin operatii cu cursor ! - o tabela cu saptaminile anului  si cite zile lucratoare( maxim 5, nu intram in calendare ) din tabela cu date au existat in saptamina curenta, Persoana.

    De ex:
    Sa zicem in in tabela cu date exista inregistrarea
    DataInceput, DataSfirsit, Persoana
    2009-07-14 , 2009-07-27, Andrei

    Vreau sa obtin :
    Sapt 2009-07-12, 2009-07-19 : 3 zile ( 14, 15, 16), Andrei
    Sapt 2009-07-19, 2009-07-26 : 5 zile ( toata sapt), Andrei
    Sapt 2009-07-26, 2009-08-01 : 1 zile ( 27), Andrei

    Acum, pare sa fie simplu... Ca sa ma scuz, mentionez ca m-am intors azi din concediu si tare mi-e greu sa gindesc... Probabil ca un cursor banal ar merge ... dar as face cursor nu pe datele din tabela, ci pe saptaminile anului, dupa care sa fac un join cu tabela initiala.

    Please help

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  08-17-2009, 8:00 PM 7512 in reply to 7505

    Re: date saptaminale

    Cel mai simplu ar fi dacă îţi construieşti o tabelă "Calendar" cu toate zilele din perioada admisibilă. Vezi:
    http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

    Poţi să generezi tabela Calendar pe baza unei tabele cu numere, generată "on-the-fly" cu una din metodele descrise în:
    http://www.projectdmx.com/tsql/tblnumbers.aspx
    (eu prefer metoda cu CTE-uri a lui Itzik Ben-Gan: e foarte rapidă şi nu necesită crearea altor obiecte în baza de date).

    După aceea, poţi să faci un:
    SELECT MIN(Data), MAX(Data),
    SUM(CASE WHEN DATEPART(dw...)
    FROM Calendar INNER JOIN Concedii ON Data BETWEEN DataInceput AND DataSfarsit
    GROUP BY Persoana, DATEPART(wk...)

    Dacă nu vrei să stochezi tabela Calendar, poţi să o construieşti on-the-fly cu un table-valued UDF, la fel ca şi tabela de numere.

    La DATEPART ar trebui să iei în considerare şi @@DATEFIRST, pentru ca rezultatul să nu fie influenţat de SET DATEFIRST.

    (dacă ai nevoie de indicii mai precise, spune-ne...)

    Răzvan
  •  08-18-2009, 10:27 AM 7518 in reply to 7512

    Re: date saptaminale


    Merge de minune ... O singura observatie ( care nu diminueaza cit de mult m-ai ajutat!) :
    nu mai e nevoie de GROUP BY Persoana, DATEPART(wk...)
    pentru ca avem deja in tabela acel datepart.

    Multumesc mult!
    Ignat Andrei
    http://serviciipeweb.ro/iafblog
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems