En iyi yanıtlayıcılar
Sql deki iki tarih arasındaki tarihleri tablo şeklinde geri döndürme [Yardım]

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...
Yanıtlar
-
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
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ı -
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
-
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
-
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ı- Yanıt Olarak Öneren Ali Rıza İnceoğlu 1 Mart 2013 Cuma 09:34
-
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.000Ben 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.
-
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ı -
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
-
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
-
-
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 ;)
-
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