ceturtdiena, 2010. gada 28. oktobris

Piemērs: Funkcija, lai iegūtu datumus laika intervālā

Piemērā izveidota funkcija, kurai tiek padoti divi datumi- DatumsNo un DatumsLidz. Funkcija atgriež tabulu ar datumiem šajā periodā (beigu datumu neieskaitot) ar divām kolonnām- Datums un DatumsChar.

Manā gadījumā pielietojums šai funkcijai- veidot smuku pārskatu (līkni), kurā tiek attēloti visi perioda datumi.
(varbūt pazīstama situācija- notikumi tiek reģistrēti tabulā, tomēr tie nenotiek katru dienu. Katram notikumam ir kāds izpildes laiks. Vēloties iegūt grafisku pārskatu ar vidējo izpildes laiku- visu skaistumu bojā tas, ka pārskatā netiek attēloti datumi, kuros nekāda aktivitāte nav notikusi).

Kāpēc funkcija atgriež otru kolonnu ar Char lauku?  Tāpēc ka latviešiem ir mode datumus rakstīt formātā "dd.MM.yyyy", bet kārtot pēc tāda lauka ir pavisam nesmuki. Protams, piekrītu, ka datuma attēlošanas formātu varēju veidot pārskatā, bet šajā gadījumā izvēlējos sev ērtāko veidu.
Create Function [dbo].[IntervalaDatumi]
(
    @DatumsNo DateTime,
    @DatumsLidz DateTime
)
Returns @tab Table
    (
        Datums DateTime,
        DatumsChar char(10)
    )
As
Begin
    Declare @Dienas int
    Declare @i int
    Set @Dienas = DateDiff(Day, @DatumsNo, @DatumsLidz)
   
    Set @i = 0;
    While (@Dienas > @i)
    Begin
        Insert Into @tab(Datums, DatumsChar)
            Values (DateAdd(Day, @i, @DatumsNo), Convert(Char(10), DateAdd(Day, @i, @DatumsNo), 104))
        Set @i = @i + 1
    End
    return
End
Un te apmēram kā tas izskatās rezultātā:

2 komentāri:

  1. viss jau strādā smuki, tikai pēdēja diena arī jāskaita iekšā un ja nu kāds idiots padod datumus otrādā secībā - lielāko no sākuma.

    AtbildētDzēst
  2. Nu tas kā kuram vajag.
    Var jau viegli pielāgot pamainot ciklu uz šādu:
    While (@Dienas >= @i)

    AtbildētDzēst