none
2 tarih arası sorguda belirli kısımları listeleme RRS feed

  • Soru

  • merhabalar,

    sql tablomda bir kolonda tarihler bir kolonda da ürünlerim mevcut ve bu 2 tarih arası sorgulama yaparak belirli bir liste alıyorum, ancak bu ürünlerin yanına bir kolon açıp belirli dönemlere göre bu ürünleri listeye dahil etmem veya etmemem gerekiyor.

    Şöyle açıklamam gerekirse bir yemek içerisinde domates kullanıyorum ancak domates kış aylarında olmadığı için bu listeden atıyorum 1 eylül - 30 nisan arası listeye dahil etmemem gerekiyor diğer aylarda liste içerisinde olmalı

    nasıl bir yapı oluşturmalıyım mesela sorgum 15 ağustos - 15 eylül arası toplam liste almam gerekirse ağustosun 15 günü domates olmalı diğer 15 günde olmamalı

    bunu yaparken yılı dikkate almayıp sadece ay-gün olarak yapmalıyım ki her yıl yeniden düzenlemiyim :)

    ürünlerin yanına tek tek kolon açıp <=01.09-30.04 gibi birşeymi tanımlamalıyım nasıl bir yol izlemeliyim,

    Şimdiden teşekkürler

    19 Nisan 2020 Pazar 19:51

Tüm Yanıtlar

  • Tablo yapısı ile birlikte, icinde veri ile, ne demek istediğinizi acar misiniz?

    (Bu arada, mantıksal hatanın farkında misin, emin olamadim. Turkiye'nin bir çok yerinde, 1 eylül - 30 nisan arası da domates bulunur. Ben Izmir'de pazara gidip de domates görmediğim hafta bilmiyorum. Yine de kati davranıp, olsun ben yok sayıyorum derseniz olabilir.) 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.

    19 Nisan 2020 Pazar 21:27
  • hayır domates sadece bir örnekti :)))

    şimdi bugünü dikkate almadan hesaplama yapmam lazım sqlde bir tarih field'im var, hemen yanında da ürünlerim

    TARİH                  ÜRÜN               DAHİLveyaHARİÇ

    15.11.2012         DOMATES               ?

    15.11.2012         BİBER                    ?

    15.11.2012         PATLICAN                ?

    ---

    16.03.2013         DOMATES                ?

    16.03.2013         PATATES                  ?

    şöyle düşünün bir sql tablom bu şekilde içeriği tanımlı, Örnek olarak diyelimki Domates Çorbası, içerisinde standart olarak hem domates salçası hemde domates tanımlı başka bir tablomda da tarihlerim ve yemekid lerim tanımlı, yani hangi tarihte hangi yemek yedirilmeli, inner join ile bu 2 tablo birbirine bağlı, ben örnek olarak ağustos ayında domates çorbasının içeriğini almam gerekirse hem domates salçası hemde domates geliyor, kış aylarıda böyle.

    Amacım menüden seçtiğim tarih mesela ağustossa o içerikten domates salçasını almasın çünkü domates var ama menüden ocak ayından bir tarih çekiyorsam bu seferde salçayı alsın domatesi almasın.

    bu şekilde 200 bin üzeri satırım var, şöyle diyebilirsiniz hem yaz ayı için hem kış ayı için bir domates çorbası belirle içeriklerini düzenle oluyor bana 400 bin küsür satır uğraştırıyor baya :)

    İçerikleri yazdığım satırlardan yaz aylarında salçayı sil diyebilirsiniz öyle yapıyorum şu an ancak 6-7 aylık toplar miktar planlaması yaparken gerekli olan aylardaki ürünü bulamıyorum.

    umarım anlatabilmişimdir çetin bey, valla her konuda siz yardımcı oluyorsunuz ayrıca teşekkürler

    19 Nisan 2020 Pazar 21:54
  • Ne yazik ki anlayamadım. Konuyu siz bildiginiz icin kolay geliyordur.

    Dedigim gibi ornek veriler olmadan, sadece anlatım ile ben pek bir sey anlamıyorum.

    Yukarida ürünler var (ve nedense yanlarında tarih), ben daha çok, Urun-Hammadde tabloları beklerdim. Hammadde tablosuna da sanırım tarih araligii koyardım (200 bin nereden geldi bilemedim, Turk mutfağı zengin ama 200 bin yemek çeşidi olacak kadar da zengin mi, siz hepsini biliyor musunuz ve bu veritabanında mevcut mu? - Hanim aksama ne yapalım dediğinde benim aklıma zar zor bir sey geliyor).

    Not: Bu yemek ile ilgiliyse bildigim en iyi yemek programı cozbim'in uygulaması. Ugrasacaginiza onu alin.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekalı arkadaşı Idris bu mesaja da atlayıp ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdiğimi, yardım etmeye calistigimi sorgulamaktır. Bu beyinsiz zavallıya, aptal olduğunu hatırlatmayı unutmayınız.


    • Düzenleyen CetinBasoz 19 Nisan 2020 Pazar 22:59
    19 Nisan 2020 Pazar 22:57
  • biraz geciktim ama teşekkür ederim çetin bey bir şekilde o sorunu çözerim inş :)
    3 Mayıs 2020 Pazar 09:40
  • merhabalar yine ben araştırmalarıma rağmen tam bir çözüm bulamadım ama tablomu oluşturdum sorabileceğim en iyi yer burası olduğu için bir kez daha anlatarak şansımı denemek istiyorum umarım bu sefer anlatabilirim :)

    TABLOM

    TARİH             ÜRÜN     BAŞLANGIÇ TARİHİ      BİTİŞ TARİHİ

    01.01.2009      ELMA       01.06.2009                 10.10.2009

    02.01.2009      ARMUT     NULL                          NULL

    tablo aşağı doğru devam ediyor ...

    10.06.2009      ELMA       01.06.2009                 10.10.2009 

    11.06.2009      ELMA       01.06.2009                 10.10.2009  

    Yukarıdaki tabloda 01.01.2009 tarihi ile 11.06.2009 tarihleri arasında TARİH kolonundan sorgu olarak liste 3 elma alabiliyorum ancak en üstteki elmanın TARİH kolonu 01.01.2009 ve BAŞLANGIÇ TARİHİ 01.06.2009 olduğu için onu listeye dahil etmemem gerekiyor.

    Kısacası TARİH kolonundaki tarih BAŞLANGIÇ TARİHİ kolonundan küçükse dahil etme büyükse ve bitiş tarihinden küçükse dahil et gibi bir yapıya ihtiyacım var.

    Ayrıca null olan değerleri her zaman dahil etmem gerekiyor bu şekilde nasıl bir ayıklama yapabilirim.

    25 Mayıs 2020 Pazartesi 13:11
  • "tablomu oluşturdum" - yanlış, sadece düz metin olarak ornek vermişsiniz (hiç yoktan iyidir). Neden bunu adam gibi:

    DECLARE @TABLOM TABLE (Tarih DATE NOT null, 
    	urun VARCHAR(10) NOT null, 
    	baslamaTarihi DATE null, 
    	bitisTarihi DATE null);
    
    INSERT @TABLOM (Tarih, urun, baslamaTarihi, bitisTarihi)
    VALUES
    ('20090101', 'ELMA', '20090601', '20091010'),
    ('20090101', 'ARMUT', null, null),
    ('20090610', 'ELMA', '20090601', '20091010'),
    ('20090611', 'ELMA', '20090601', '20091010');

    seklinde bir ornek olarak yazmıyorsunuz acaba.

    Cevabiyla birlikte tümü :

    DECLARE @TABLOM TABLE (Tarih DATE NOT null, 
    	urun VARCHAR(10) NOT null, 
    	baslamaTarihi DATE null, 
    	bitisTarihi DATE null);
    
    INSERT @TABLOM (Tarih, urun, baslamaTarihi, bitisTarihi)
    VALUES
    ('20090101', 'ELMA', '20090601', '20091010'),
    ('20090101', 'ARMUT', null, null),
    ('20090610', 'ELMA', '20090601', '20091010'),
    ('20090611', 'ELMA', '20090601', '20091010');
    
    SELECT * 
    FROM @TABLOM
    WHERE (baslamaTarihi IS NULL OR Tarih >= baslamaTarihi) AND 
    (bitisTarihi IS NULL OR Tarih <= bitisTarihi);

     


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    • Düzenleyen CetinBasoz 25 Mayıs 2020 Pazartesi 14:00
    25 Mayıs 2020 Pazartesi 13:59
  • peki çetin bey ADAM GİBİ yazıyorum, o şekilde yazmamın sebebi gözünüzde canlanması için

    şimdi adam gibi sorayım

    karmaşık kodlar


    burda anlattığınız yöntemi uygulamaya çalıştım, başlangıç ve bitiş tarihlerinin ay ve gün olarak karşılaştırmaya çalışıyorum, yılı dikkate almadan bilginize, diğer şekliyle her yıl o kolon içerikleriniz düzenlenmesi gerekir

    Sonuç olarak sadece başlangıç ve bitiş tarihleri belirlediklerimin listesini alabiliyorum, null olanlar görünmüyor

    üstte where ile başlayıp 2 tarih arasını soruladıktan sonra and ile tarihin ay ve gününü ve başlangıç bitiş tarihlerinin ay ve gününü alarak büyük küçük kontrolü yapmayı denedim ama mantığım mı yanlış



    25 Mayıs 2020 Pazartesi 14:13
  • Sizin yazdiginizin benim yazdigimla alakası yok.

    Adam gibi derken, kod seklinde yazın da nasıl olursa olsun demek istememiştim. Kodun da bir amaci olması lazım, ne nereden geliyor, niye kullanılıyor belli olması lazım.

    Ornegin sizin yazdiginizda, @tarih1, @tarih2 diye varchar degerler yaratiyorsunuz, tarihdtl diye bir alan var, her ne hikmetse try_convert ile date'e çeviriyorsunuz, ondan sonra da varchar olan @tarih2 ile kiyasliyorsunuz.  Ben bunların amacını bilemem ki. Bana amaçsız gorunuyorlar. Sonuçta benim icin tarihdtl alanının data tipi meçhul. Adam gibi derken bu tip temel bilgileri ve düzgün, kod seklinde verileri kastetmiştim. Bosuna adam gibi demedim yani.

    "Adam gibi"yi büyük harfle, adimi ise kucuk harfle yazmanız çocukça bir eğlence herhalde.



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    25 Mayıs 2020 Pazartesi 15:37
  • yok adam gibi kısmını vurgulamak için büyük yazdım diğerinin hepsi küçük, çetin bey benim burda amacım üzüm yemek bağcıyı dövmek değil. Çocukta değilim

    Ben sizden aldığım cevaplarla çok farklı şeyler yaptım daha öncesinde de benim basitleştirerek sormam kimse kimsenin yazdığının mantığını bilmez herkes kesnine göre yazar ben takıldığım yerleri sadece sormaya çalışıyorum yoksa derdim elmayla armutu ayırmak değil :) öyle olsa en üstteki elmayı silerim sorun çözülür, ben sizden aldığım cevapları farklı şekillerde kullanıyorum ve işime yarıyorda

    Şimdi

    bir store procedure oluşturuyorum @tarih1 ve @tarih2 programdan nvarchar olarak geldiği için orada tarihe çeviriyorum, tarihdtl dediğimiz kısımda tarih kolonumuz onuda nvarchar tuttuğum için sorgu sırasında çeviriyorum,

    zaten bu şekilde tablo çizerek anlatmamın sebebi olay çok karmaşık olduğu için ayrıca tarihleri ay ve gün alırkende yeniden nvarchara çevirerek alıp karşılaştırıyorum siz o kısımlara takılmayın çünkü bu çevirmeler doğru ve komut çalışıyor

    benim tek derdim @tarih1 ve @tarih2 tarihleri arasını tarihdtl kolonunda sorgulayıp liste alırken başlangıç ve bitiş tarihlerini de ay ve gün olarak karşılaştırıp o satırları listeye dahil etmek veya etmemek.

    Sizin verdiğiniz koddan yola çıkarak uyguluyorum ama sadece başlangıç bitiş tarihi olanları bana bulup listeliyor null değerler yok, aslında benim istediğim tam tersi null olanlar ayrıca başlangıç bitiş tarihleri olanlardan da uyanlar.

    where şartını belirlerken saçmalıyorum sanırım benim mantığım nedense ilk olarak tarih1 ve tarih2 yi listele sonra and ile diğer şartı belirle diyor ama sql kısmım çok iyi değil çalışması böyle değilmidir yani hem tarih aralığı hemde başlama bitiş kolonlarını iç içe mi bir şart belirlemeliyim

    saygılar




    25 Mayıs 2020 Pazartesi 15:56
  • Yani sonuçta ben körlemesine denemeliyim :)

    WHERE TRY_CONVERT(DATE, tarihdtl, 104) >= @tarih1
          AND TRY_CONVERT(DATE, tarihdtl, 104) <= @tarih2      
    	  AND
    	  CAST(SUBSTRING(CONVERT(CHAR(8), TRY_CONVERT(DATE, tarihdtl, 104), 112),5,4) AS INT)
    	  BETWEEN 
    	  CAST(SUBSTRING(CONVERT(CHAR(8), COALESCE(baslangictarihi, '20000101'), 112),5,4) AS INT) AND 
    	  CAST(SUBSTRING(CONVERT(CHAR(8), COALESCE(bitistarihi, '20001231'), 112),5,4) AS INT)      



    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    • Düzenleyen CetinBasoz 25 Mayıs 2020 Pazartesi 16:49
    25 Mayıs 2020 Pazartesi 16:48
  • keşke bağlantı şansımız olabilseydi :)

    deneyeyim hemen uyarlayarak kendime

    Msg 245, Level 16, State 1, Line 5
    Conversion failed when converting the varchar value '5.20' to data type int.


    25 Mayıs 2020 Pazartesi 17:11
  • keşke bağlantı şansımız olabilseydi :)

    deneyeyim hemen uyarlayarak kendime

    Msg 245, Level 16, State 1, Line 5
    Conversion failed when converting the varchar value '5.20' to data type int.


    Kodu değiştirmişsiniz sanırım.


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    25 Mayıs 2020 Pazartesi 17:40
  • hayır olduğu gibi kopyala yapıştır yaptım bu hatayı verdi sonra üstünde denemeler yaptım sadece hata değişti :)
    25 Mayıs 2020 Pazartesi 17:43
  • Merhaba,

    Öncelikle özür dilerim. Daha önceki cevabı yanlış yere yanıt olarak yolladım. Lütfen beni mazur görün.

    Çetin Bey'in verdiği örnek tablo üzerinden istediğiniz sonuca ulaşmaya çalıştım.

    Bu olay her yıl tekrarlanacak ise başlangıç ve bitiş tarihlerini date olarak tutmanız gerekmez. INT ya da SMALLINT alan tipleri işinizi görür. Basit bir şekilde  AY * 100 + GÜN şeklinde depolanabilir. Bu durumda;
    DECLARE @tablom TABLE (Tarih DATE NOT NULL, 
    urun VARCHAR(10) NOT NULL, 
    baslamaTarihi SMALLINT NULL, 
    bitisTarihi SMALLINT NULL);
    
    INSERT @tablom (Tarih, urun, baslamaTarihi, bitisTarihi)
    VALUES ('20090101', 'ELMA', 601, 1010),
    ('20090101', 'ARMUT', NULL, NULL),
    ('20090610', 'ELMA', 601, 1010),
    ('20090611', 'ELMA', 601, 1010);
    
    SELECT * FROM @tablom 
    WHERE DATEPART(MONTH, Tarih) * 100 + DATEPART(DAY, Tarih) 
    BETWEEN ISNULL(baslamaTarihi, 101) AND ISNULL(bitisTarihi, 1231);
    şeklinde kullanabilirsiniz.
    25 Mayıs 2020 Pazartesi 17:59
  • teşekkür ederim dediğiniz yönteme göre deneme yapacağım
    25 Mayıs 2020 Pazartesi 18:06
  • Bununla hata aldigini söylüyor.


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    25 Mayıs 2020 Pazartesi 19:46
  • Evet Çetin Bey,

    Siz, örneğinizde tarih alanını '20000101' şeklinde nokta olmadan kullanıyorsunuz. Ancak arkadaşın verdiği hataya göre tarih içinde nokta var. Bu durumu gözden kaçırmış.

    25 Mayıs 2020 Pazartesi 20:22
  • sanırım bende sorun var ben toplu datayı excel'den sql'e import ediyorum ama ilginçtir 100 bin satır içerisinde 150-200 satırda başlangıç bitiş tarihleri var diğerleri boş ama başlangıç bitiş tarihleri kolonlarında null alanları listelediğimde sadece 200 satır falan boş diyor normalde 150-160 bin üstü satır boş olmalı  diğer boş hücrelerde null yazmadığı için görmüyor sanırım, bu da doğru sorgu çekmemi engelliyor, önce bunu düzeltmeliyim, is not null listelediğimde bütün boş hücreler geliyor sizide uğraştırdım kusuruma bakmayın 
    25 Mayıs 2020 Pazartesi 20:31
  • Merhabalar sencer beyin dediği durumu henüz deneyemedim çünkü tüm tarih formatımı değiştirmem gerekecek bu benim için son seçenek olacak sanırım hiç çarem kalmazsa oturup hepsini baştan düzenleyip sql'in deneyeceğim.

    Çetin bey kızacak yine ama şöyle açıklamalıyım

    TARİHdtl            Ürünadı         Başlangıçtarihi         Bitiştarihi

    15.05.2011     A ürünü          01.05.2009             15.11.2009

    15.05.2011     B ürünü          16.11.2009             02.05.2009

     (baslangictarihi is null or (SELECT right(CONVERT(date,baslangictarihi, 104), 5)) <= (SELECT right(CONVERT(date,tarihdtl, 104), 5))
    	  and
    	  (bitistarihi is null or (SELECT right(CONVERT(date,bitistarihi, 104), 5)) >= (SELECT right(CONVERT(date,tarihdtl, 104), 5))))
    	  

    yukarıdaki kodla 15.05.2011 tarihini sorguladığımda normal olarak A ürününü görüp B ürününü görmüyorum yani istediğim gibi çalışıyor ancak tarih kolonunun 01.01.2009 olduğunu düşünürsek A ve B ürünlerinin hiçbirini göremiyorum amacım bu seferde B ürününü görüp A ürününü görmemek, başlangıç ve bitiş tarihlerim ona göre ayarlı zaten biri bittiği an diğerinin başlaması acaba tarihlerimi yanlış belirtiyorum ?

    formüldeki büyük küçük işaretlerini değiştirdiğimde de durum tam tersine dönüyor ancak bu formulün aynısını altına ters mantıkla yazınca hiçbirşey listelemiyor, kısacası yukarıdaki formülün tam ters mantığını nasıl uygulayabilirim
    26 Mayıs 2020 Salı 11:23
  • Merhaba,

    Çetin Bey kızmakta haklı bence. Bilgileri verirken sadece olayın detayını veriyorsun ancak bu tip sorularda bize olayın değil o olayı gerçekleştirecek verinin detayı lazım. Bu yüzden gördüklerime göre söyleyeyim.

    İkinci verdiğin örneği de hesaba katarsak o zaman INT ya da SMALLINT alan kullanman sorgunun uzamaması için şart olur.

    DECLARE @tablom TABLE (
    	Tarih DATE NOT NULL, 
    	urun VARCHAR(10) NOT NULL, 
    	baslamaTarihi SMALLINT NULL, 
    	bitisTarihi SMALLINT NULL);
    
    INSERT @tablom (Tarih, urun, baslamaTarihi, bitisTarihi)
    VALUES ('20090101', 'ELMA', 601, 1010),
    ('20090101', 'ARMUT', NULL, NULL),
    ('20090610', 'ELMA', 601, 1010),
    ('20090611', 'ELMA', 601, 1010);
    
    SELECT *
    FROM @tablom
    WHERE DATEPART(MONTH, Tarih) * 100 + DATEPART(DAY, Tarih) BETWEEN
    	ISNULL(baslamaTarihi, 101) AND CASE
    		WHEN ISNULL(baslamaTarihi, 101) < ISNULL(bitisTarihi, 1231) THEN ISNULL(bitisTarihi, 1231)
    		ELSE ISNULL(bitisTarihi, 1231) + 1200
    	END;
    Bu şekilde sonuca ulaşabilirsin. Yıldönümü olduğu için VARCHAR bir alan ile bu işi yapman gerçekten zor olur. Ancak sayısal alan kullanırsan eğer bitiş tarihi, başlangıç tarihinden küçük olursa yıldönümü olduğunu için basit bir şekilde üstüne 1200 ekleyip 12 ay ileri atabilirsin. Yani 1116 başlangıç, 1702 ise bitiş olacak ve aradaki zaman farkı yaklaşık 6 ay olacaktır ki bu seni sonuca götürür. Yine de elindeki veri ile bunu denemen lazım.

    26 Mayıs 2020 Salı 12:47
  • haklısınızda baya veri var veritabanında onun için tarihleri falan çevirmem çok vaktimi alıcak gibi duruyor bende bunla uğraşmadan sorgu sırasında çevirerek sonuç alarak işin içinden çıkma derdindeyim, yoksa dediğiniz yöntem doğru
    26 Mayıs 2020 Salı 12:59
  • Karadeniz'de bir kaymakam arabasıyla yolda giderken, bir de bakmış, bir köylü köprünün ayağını elindeki keserle yontmaya çalışıyor. Özel kalemine, "sorun bakalım ne yapmaya çalışıyor" demiş. Sormuşlar köylüye, o da cevap vermiş,  "ha uşağım, ben ne zaman buradan geçmeye kalksam, eşeğimin kulakları değiyor, ben de biraz yontuyorum". Kaymakama iletmişler durumu, o da, "söyleyin, yeri kazsın da öyle geçsin" demiş. Dönmüşler adama "kaymakam beyimiz yeri kazsın da öyle geçsin diyor" demişler. Adam da başını iki yana sallamış, "Allah Allah, ben diyorum eşeğin kulağı, o diyor ayağı".

    Bizim hikaye de buna dondu, kulaklara fazla takildiniz, hala ben'm verdigim kodla ilgisi olmayan seyler yazıyorsunuz.

    DECLARE @test table (Tarihdtl nvarchar(20),
       urun nvarchar(20),
       baslangic nvarchar(20) null,
       bitis nvarchar(20) null);
    
    insert into @test (Tarihdtl, urun, baslangic, bitis ) values 
    	('15.05.2011', 'A ürünü', '01.05.2009', '15.11.2009'),
    	('15.05.2011', 'B ürünü', '16.11.2009', '02.05.2009'),
    	('15.05.2011', 'C ürünü', null, '02.05.2009'),
    	('15.05.2011', 'D ürünü', '16.11.2009', null),
    	('15.05.2011', 'E ürünü', null, null),
    	('15.05.2011', 'F ürünü', '', '02.05.2009'),
    	('15.05.2011', 'G ürünü', '16.11.2009', ''),
    	('15.05.2011', 'H ürünü', '', ''),
    	('15.05.2011', 'I ürünü', 'xx', '02.05.2009'),
    	('15.05.2011', 'J ürünü', '16.11.2009', 'xx'),
    	('15.05.2011', 'K ürünü', 'xx', 'xx'),
    	('15.05.2011', 'L ürünü', '', '15.11.2009'),
    	('15.05.2011', 'M ürünü', '01.05.2009', ''),
    	('15.05.2011', 'N ürünü', '', '');
    
    
    WITH dtConverted1 (t, bs, bt, tarih, urun, baslangic, bitis)
    AS (SELECT TRY_CONVERT(DATE, Tarihdtl, 104),
               TRY_CONVERT(DATE, baslangic, 104),
               TRY_CONVERT(DATE, bitis, 104),
               Tarihdtl, urun, baslangic, bitis
        FROM @test),
         dtConverted (t, bs, bt, tarih, urun, baslangic, bitis)
    AS (SELECT CAST(SUBSTRING(CONVERT(CHAR(8), COALESCE(t, '20000101'), 112), 5, 4) AS INT),
               CAST(SUBSTRING(CONVERT(CHAR(8),
                    COALESCE( CASE WHEN bs > '19000101' THEN bs END,'20000101'), 112 ), 5, 4) AS INT),
               CAST(SUBSTRING(CONVERT(CHAR(8),
                    COALESCE( CASE WHEN bt > '19000101' THEN bt END,'20001231'), 112 ), 5, 4) AS INT),
               Tarih, urun, baslangic, bitis
        FROM dtConverted1)
    SELECT *
    FROM dtConverted
    WHERE t BETWEEN bs AND bt;

      Not: Bu da DBFiddle Demosu. 


    Blog
    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    • Düzenleyen CetinBasoz 26 Mayıs 2020 Salı 14:30
    26 Mayıs 2020 Salı 14:25
  • Haklısınız Çetin Bey.
    26 Mayıs 2020 Salı 16:56