none
Sql deki iki tarih arasındaki tarihleri tablo şeklinde geri döndürme [Yardım] RRS feed

  • Soru

  • Arkadaşlar girilen iki tarih arasındaki tüm tarihleri listelemek istiyorum bu konuda yardımcı olursanız çok sevinirim.

    Girdiler: Tarih1='01.03.2013'    ;   Tarih2='10.03.2013'

    Çıktı   :

    Tam Tarih      -   Gün    -   Ay   -    Yıl

    01.03.2013   -    01     -   03   -    2013

    02.03.2013   -    02     -   03   -    2013

    03.03.2013   -    03     -   03   -    2013

    04.03.2013   -    04     -   03   -    2013

    .................

    10.03.2013   -    03     -   03   -    2013

    Bu çıktıyı giriş çıkış programında kullancam arkadaşlar.Personel adına göre girilen iki tarih arasındaki personelin işe giriş çıkış saatlerini ve devamsızlıklarını listelicem.

    Bu çıktıyı lef join le sorgulayıp;

    01.03.2013     Ptesi       ilkgiriş: 9:00       son çıkış:18:00    

    02.03.2013     Salı          ilkgiriş: 9:00       son çıkış:18:00

    01.03.2013     Çar          ilkgiriş: -----      son çıkış :---------

    .............

    Yardımlarımız için şimdiden TEŞEKKÜRLER...

    28 Şubat 2013 Perşembe 10:01

Yanıtlar

Tüm Yanıtlar

  • Tablonun şemasını paylaşırsanız daha iyi yardımcı olabiliriz. Buradaki mantık tabloyu kullanıcı ve gün bazında gruplayıp MIN ve MAX ile en küçük saati ve en yüksek saati bulmaktır.

    Ahmet Kaymaz
    http://www.ahmetkaymaz.com
    C# VB.NET ASP.NET kitabı

    28 Şubat 2013 Perşembe 15:45
  • Günlük olarak tüm personellerin ilk giriş ve  son çıkış saatlerini buluyorum zaten o raporu yaptım. Burda sormuş olduğum rapor ise  ;

    Personel adı:Ahmet Kaymaz    01.03.2013  ve  31.05.2013  gibi 2 aylık yada 5 aylık gibi dilimler seçilince aradaki günleri raporlamak

    Çıktı :  {Ahmet Kaymaz } için;

    Gün     -    Tarih        -   Giriş Saati  -  Çıkış Saati  

    Ptesi   -  01.03.2013  -     9:00           -    18:30

    Salı     -  02.03.2013   -    8:30           -    19:00

    Çar     -  03.03.2013   -    Null           -    Null      => Gelmemiş

    Per    -   03.03.2013   -     9:00           -    18:30    

    Cuma -   03.03.2013   -     9:00           -    18:30    

    Cmrts-   03.03.2013   -    Null            -   Null          => Hafta sonu

    pazar-   03.03.2013   -     Null           -    Null         => hafta sonu 

    ......

    ......

    pazar-   31.05.2013   -     Null           -    Null         => hafta sonu 

    Kayıtlar bu şekilde arada hiç gün atlamadan iki tarih arasındaki tüm günleri göstererek gelicek.

    Elimde eventların bulunduğu bir tablo var ama hafta sonu yada personelin gelmediği günler kart okutamadığı için  eksik günler raporda gözükmüyor yani bu çıktıyı alamıyorum.  Ama burda size sormuş olduğumuz problemi çözersem  Left joinle eventlar tablosunu burdan dönen tabloya bağlayıp  kart okutmadığı günleride rapora getirmiş olcam...


    • Düzenleyen eakin 28 Şubat 2013 Perşembe 16:02
    28 Şubat 2013 Perşembe 16:00
  • pivot kelimesi ile çözülecek ama Ahmet beyin dediği gibi tablo yapısını tam görsek net bir yanıt olurdu sanırım

    http://msdn.microsoft.com/tr-tr/library/ms177410(v=sql.105).aspx bu linkte pivot kullanımı verilmiş incelerseniz sorununuzu çözebilirsiniz sanırım


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com
    MCC

    1 Mart 2013 Cuma 08:09
  • Bunu yapabilmek için 2 tarih aralığındaki tüm tarihlerin olduğu bir veri kaydı olması gerekiyor. Bunu istersen bir tabloya aktarabilir veya CTE ile aşağıdaki gibi yapabilirsiniz. Ayrıca tarih tablosuyla ilgili aşağıdaki makale yardımcı olabilir.

    http://www.ahmetkaymaz.com/2008/02/27/sqlde-ozet-tarih-tablosu-date-dimension-table/

    /*SELECT CAST('20130201' as smalldatetime) as Tarih, '09:00' as Giris, '15:00' Cikis INTO #GirisCikis
    UNION ALL SELECT CAST('20130215' as datetime), '09:30' as Giris, '17:00' Cikis
    UNION ALL SELECT CAST('20130218' as datetime), '09:30' as Giris, '17:00' Cikis*/
    
    
    WITH AyGun
    AS
    (
        SELECT CAST('20130201' AS Date) AS Tarih
        UNION ALL
        SELECT DATEADD(dd, 1, Tarih)
        FROM AyGun
        WHERE DATEADD(dd, 1, Tarih) < cast('20130401' as Date)
    )
    --SELECT * FROM AyGun
    
    SELECT * FROM AyGun a LEFT JOIN #GirisCikis b ON a.Tarih=b.Tarih
    


    Ahmet Kaymaz
    http://www.ahmetkaymaz.com
    C# VB.NET ASP.NET kitabı

    1 Mart 2013 Cuma 09:12
  • 2 tarih aralığındaki bir tabloya ihtiyacım var doğru ama ben bunu fiziksel olarak tutmak istemiyorum.Şöyle birşey yapsak ;

    DECLARE @t DATETIME,@t1 DATETIME,@gunFarki int,@tamTarih DATETIME,@i INT
    SET @t ='2013.03.01'
    SET @t1='2013.03.31'
    SET @i=0
    
    SET @gunFarki=DATEDIFF(DAY,@t,@t1)
    --SELECT @gunFarki
    CREATE TABLE #sTarihler(
    tarih DATETIME
    )
    
    WHILE @i<=@gunFarki
    BEGIN
    	SET @tamTarih = DATEADD(d,@i,@t)
    	INSERT INTO #sTarihler VALUES(@tamTarih)
    	SET @i=@i+1
    END
    
    SELECT * FROM #sTarihler st
    DROP TABLE #sTarihler
    Çıktı :
    2013-03-01 00:00:00.000
    2013-03-02 00:00:00.000
    2013-03-03 00:00:00.000
    2013-03-04 00:00:00.000
    2013-03-05 00:00:00.000
    2013-03-06 00:00:00.000
    2013-03-07 00:00:00.000

    Ben bunu düzenlerim gün ay olarak ama bunu fonksiyonla döndürebilirmiyim tablo şeklinde. Değer bunu yaparsam

    select * from fn_Tarihler() fn   left  join  hareketler.....      şenklinde bağlıycam.

    1 Mart 2013 Cuma 12:32
  • Benim yazdığım sorguda tablo oluşturmuyorsun. Onu kullanman daha pratik olacak diye düşünüyorum.

    Ahmet Kaymaz
    http://www.ahmetkaymaz.com
    C# VB.NET ASP.NET kitabı

    1 Mart 2013 Cuma 14:14
  • Vermiş olduğunuz sorguda tarih aralığını biraz geçişletince şöyle bir hata veriyor hocam.Bu tarih aralığı sıkıntısını çözersek tam istediğim gibi birşey oluyor.

    The statement terminated. The maximum recursion 100 has been exhausted before statement completion.


    • Düzenleyen eakin 1 Mart 2013 Cuma 15:55
    1 Mart 2013 Cuma 15:45
  • SELECT * FROM AyGun a LEFT JOIN #GirisCikis b ON a.Tarih=b.Tarih option (maxrecursion 0)

    Ahmet Kaymaz
    http://www.ahmetkaymaz.com
    C# VB.NET ASP.NET kitabı

    • Yanıt Olarak İşaretleyen eakin 1 Mart 2013 Cuma 18:16
    1 Mart 2013 Cuma 16:07
  • Ahmet Bey yardımlarınızı için TEŞEKKÜRLER tam istediğim gibi birşey bu.
    1 Mart 2013 Cuma 18:18
  • Merhabalar,

    Konu üzerinden zaman geçmiş ve konuda kapanmış aslında ama benimde ihtiyacım olan ve araştırmalarım sonucunda bulduğum daha pratik bir yolu paylaşmak istedim.

    İlgili makale linktedir : http://www.ahmetsen.net/sql-iki-tarih-arasindaki-gunleri-tarihleri-listelemek-tablo-kullanmadan.html

    Burada sadece aralığını almak istediğiniz tarihleri belirtiyorsunuz ve sorguyu çalıştırıyorsunuz ;)

    9 Eylül 2014 Salı 11:06
  • Ben de cok gec gordum bu soruyu. Bu gibi durumlar icin tavsiye edilen databaseinde onceden hazirlanmis "tally" tablolarinin bulunmasi (integer degerler icin 1...N, datetime icin bTarih....eTarih). Bu tablolar normal olarak bir kere hazirlaniyor ve gerektiginde sadece join icin kullaniliyor. Efektif bir cozum. Yine de herhangi bir tablo saklamak istemezseniz bu gibi degerleri mevcut tablolardan olusturabilirsiniz. Ornegin '2013/03/01' den sonraki 5000 gun:

    DECLARE @tarih AS DATETIME,
        @gun AS INT
    SET @tarih = '2013/3/1'
    SET @gun = 5000
    SELECT  @tarih + N - 1
    FROM    ( SELECT TOP 10000
                        ROW_NUMBER() OVER ( ORDER BY t1.Object_ID ) AS N
              FROM      Master.sys.All_Columns t1
                        CROSS JOIN Master.sys.All_Columns t2
            ) tmp
    WHERE   N <= @gun
    


    • Düzenleyen CetinBasoz 9 Eylül 2014 Salı 12:11
    9 Eylül 2014 Salı 12:10