Erp Asistanı Erp Asistanı
Netsis SQL

Netsis Tarih Filtreleri SQL: STHAR_TARIH ile Dönemsel Raporlar

Netsis veritabanında STHAR_TARIH ve TBLCAHAR.TARIH ile bu ay, geçen ay, YTD dönemsel rapor sorguları. Doğru >= ve < tarih filtreleme kalıpları.

Erp Asistanı Erp Asistanı Editör ekibi 6 dk okuma
Netsis Tarih Filtreleri SQL: STHAR_TARIH ile Dönemsel Raporlar

Netsis veritabanında SQL ile dönemsel rapor hazırlarken en sık karşılaşılan sorunlar, saat bilgisi içeren kayıtların filtreden kaçması veya fonksiyon kullanımı yüzünden sorguların yavaşlamasıdır. TBLSTHAR tablosundaki STHAR_TARIH ve TBLCAHAR tablosundaki TARIH alanları datetime tipinde tutulur. Bu rehberde, Netsis raporlarında veri kaybını önleyen >= ve < filtreleme desenini, "bu ay", "geçen ay", "yılbaşından bugüne (YTD)" gibi hazır SQL kalıplarını ve VADE_TARIHI üzerindeki NULL kontrolü mantığını inceliyoruz. Netsis veri mimarisi hakkında genel bir bakış için Netsis tablo yapısı rehberi yazımıza göz atabilirsiniz.

1. Neden BETWEEN Değil de >= ve < Deseni?

T-SQL'de datetime kolonları hem tarih hem de saat/dakika/saniye verisi saklar. Netsis standart fatura girişlerinde saati 00:00:00.000 olarak kaydetse de entegrasyonlar, kasa hareketleri veya özel modül kayıtları gün içi saat bilgisi barındırabilir.

STHAR_TARIH BETWEEN '20260501' AND '20260531' filtresi kullandığınızda, SQL Server bitiş değerini örtük olarak '2026-05-31 00:00:00.000' kabul eder. Dolayısıyla 31 Mayıs günü saat 15:30'da işlenen bir satış faturası bu aralığın dışında kalır.

En sağlıklı yöntem, dönemin başlangıcını >= ile dahil edip, bir sonraki dönemin ilk gününü < ile dışarıda bırakmaktır:

-- 2026 Mayıs ayı satış hareketleri (Kayıp kayıt olmadan)
SELECT 
    STOK_KODU,
    SUM(STHAR_GCMIK) AS ToplamMiktar,
    SUM(STHAR_GCMIK * STHAR_NF) AS ToplamNetTutar
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
  AND STHAR_FTIRSIP IN ('1', '3')
  AND SUBE_KODU = 0
  AND STHAR_TARIH >= '20260501' 
  AND STHAR_TARIH < '20260601'
GROUP BY STOK_KODU;

2. Netsis'te Temel Tarih Kolonları

Netsis hareket tablolarında tarih kolonlarının adlandırılması ve taşıdığı veri tipleri farklılık gösterebilir:

Tablo Tarih Kolonu Veri Tipi Modül / Anlamı Dikkat Edilecek Nokta
TBLSTHAR STHAR_TARIH datetime Stok Hareketi / Fatura Kalemi Hareket yönü STHAR_GCKOD ile birlikte filtrelenmelidir.
TBLFATUIRS TARIH datetime Fatura ve İrsaliye Başlığı Kalem-başlık tarihleri entegrasyon durumuna göre farklılık gösterebilir.
TBLCAHAR TARIH datetime Cari Hesap Hareketi Evrak işlem tarihidir.
TBLCAHAR VADE_TARIHI datetime Cari Vade Tarihi Nakit/açılış kayıtlarında NULL kalabilir.
TBLSIPAMAS TARIH datetime Sipariş Başlığı Sipariş onay ve giriş tarihi.
TBLSIPATRA STHAR_TARIH datetime Sipariş Kalemi Kalem teslim tarihi.

3. Dinamik Tarih Kalıpları (Bu Ay, Geçen Ay, YTD)

Raporlarınızı her ay manuel tarih yazmadan otomatikleştirmek için SQL Server tarih fonksiyonlarını (DATEFROMPARTS, DATEADD, DATEDIFF) kullanabilirsiniz. Stok hareketlerinin detayları için Netsis stok hareketleri SQL rehberi yazımızı inceleyebilirsiniz.

Bu Ayın Net Satış Raporu

İçinde bulunulan ayın ilk gününden sonraki ayın ilk gününe kadar olan hareketleri listeler:

SELECT 
    STOK_KODU,
    SUM(STHAR_GCMIK) AS SatisMiktari,
    SUM(STHAR_GCMIK * STHAR_NF) AS NetCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
  AND STHAR_FTIRSIP IN ('1', '3')
  AND SUBE_KODU = 0
  AND STHAR_TARIH >= DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)
  AND STHAR_TARIH < DATEADD(month, 1, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1))
GROUP BY STOK_KODU
ORDER BY NetCiro DESC;

Geçen Ayın Satış Raporu

Geçmiş ayın başlangıç ve bitişini DATEDIFF kullanarak dinamik olarak hesaplar:

SELECT 
    STOK_KODU,
    SUM(STHAR_GCMIK) AS SatisMiktari,
    SUM(STHAR_GCMIK * STHAR_NF) AS NetCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
  AND STHAR_FTIRSIP IN ('1', '3')
  AND SUBE_KODU = 0
  AND STHAR_TARIH >= DATEADD(month, DATEDIFF(month, 0, GETDATE()) - 1, 0)
  AND STHAR_TARIH < DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
GROUP BY STOK_KODU
ORDER BY NetCiro DESC;

Yılbaşından Bugüne (YTD) Satış Özeti

Mevcut yılın 1 Ocak tarihinden bugünün sonuna kadar olan verileri çeker:

SELECT 
    STOK_KODU,
    SUM(STHAR_GCMIK) AS YTD_Miktar,
    SUM(STHAR_GCMIK * STHAR_NF) AS YTD_NetCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
  AND STHAR_FTIRSIP IN ('1', '3')
  AND SUBE_KODU = 0
  AND STHAR_TARIH >= DATEFROMPARTS(YEAR(GETDATE()), 1, 1)
  AND STHAR_TARIH < DATEADD(day, 1, CAST(GETDATE() AS DATE))
GROUP BY STOK_KODU
ORDER BY YTD_NetCiro DESC;

4. TBLCAHAR ve VADE_TARIHI'nde NULL Kontrolü

Cari yaşlandırma ve vadesi geçen bakiye analizlerinde TBLCAHAR.VADE_TARIHI kolonu kullanılır. Ancak devir fişleri (HAREKET_TURU = 'A') veya doğrudan kasadan girilen hareketlerde VADE_TARIHI alanı NULL gelebilir. Filtrelerinizde ISNULL(VADE_TARIHI, TARIH) kontrolü yapmazsanız bu kayıtlar analiz dışı kalır.

Cari borç ve alacak takibi ile ilgili ayrıntılı sorgular için Netsis cari ekstre ve bakiye SQL içeriğimizden faydalanabilirsiniz.

-- Vadesi geçmiş açık bakiye analizi (NULL vade kontrolüyle)
SELECT 
    CARI_KOD,
    SUM(BORC) AS ToplamBorc,
    SUM(ALACAK) AS ToplamAlacak,
    SUM(BORC - ALACAK) AS Bakiye,
    SUM(CASE 
        WHEN ISNULL(VADE_TARIHI, TARIH) < CAST(GETDATE() AS DATE) 
        THEN (BORC - ALACAK) 
        ELSE 0 
    END) AS VadesiGecenBakiye
FROM TBLCAHAR
WHERE SUBE_KODU = 0
GROUP BY CARI_KOD
HAVING SUM(BORC - ALACAK) <> 0
ORDER BY VadesiGecenBakiye DESC;

5. Son 30 Gün Günlük Satış Trendi

Belirli bir hareket trendini gün bazında özetlemek için tarih kolonunu DATE tipine dönüştürerek gruplayabilirsiniz:

SELECT 
    CAST(STHAR_TARIH AS DATE) AS IslemTarihi,
    COUNT(DISTINCT FISNO) AS FaturaSayisi,
    SUM(STHAR_GCMIK) AS ToplamMiktar,
    SUM(STHAR_GCMIK * STHAR_NF) AS ToplamCiro
FROM TBLSTHAR
WHERE STHAR_GCKOD = 'C'
  AND STHAR_FTIRSIP IN ('1', '3')
  AND SUBE_KODU = 0
  AND STHAR_TARIH >= DATEADD(day, -30, CAST(GETDATE() AS DATE))
  AND STHAR_TARIH < DATEADD(day, 1, CAST(GETDATE() AS DATE))
GROUP BY CAST(STHAR_TARIH AS DATE)
ORDER BY IslemTarihi DESC;

Sık yapılan hatalar

  • BETWEEN Kullanımı: BETWEEN kullanıldığında bitiş günündeki saat/dakika içeren kayıtların rapora dahil edilmemesi.
  • Kolon Üzerinde Fonksiyon Çalıştırma: WHERE YEAR(STHAR_TARIH) = 2026 şeklinde yazılan filtrelerin indeksi devre dışı bırakması (Index Scan / Table Scan) ve sorguyu yavaşlatması.
  • VADE_TARIHI NULL Kontrolünün Atlanması: Cari yaşlandırma raporlarında ISNULL(VADE_TARIHI, TARIH) kontrolü yapılmadığı için devir ve kasa fişlerinin vadesiz kabul edilip dışlanması.
  • Belge Tipi Filtresinin Unutulması: TBLSTHAR tablosunda STHAR_FTIRSIP veya STHAR_GCKOD filtresi verilmeden tarih filtresi yazıldığında alışların, iadelerin ve transferlerin ciroya karışması.
  • SUBE_KODU Ayrımının Yapılmaması: Tek şubeli veritabanlarında dahi SUBE_KODU filtresinin sorguya eklenmemesi nedeniyle indeks performansının düşmesi.

Sık sorulanlar

STHAR_TARIH yerine TBLFATUIRS.TARIH kullanmak fark yaratır mı? Kalem bazında ürün, miktar ve net tutar analizleri TBLSTHAR tablosunda tutulduğu için STHAR_TARIH kullanmak sorguyu ek bir JOIN işleminden kurtarır ve performansı artırır.

Tarih fonksiyonları (DATEFROMPARTS vb.) sorguyu yavaşlatır mı? Hayır. Bu fonksiyonlar WHERE koşulunun sağ tarafında yer aldığı sürece sorgu derlenirken bir kez hesaplanır ve STHAR_TARIH indekslerinin doğrudan kullanılmasına olanak tanır.

TBLCAHAR tablosundaki BAKIYE kolonu dönemsel filtrede kullanılabilir mi? Hayır. TBLCAHAR.BAKIYE o satır anındaki yürüyen bakiyeyi gösterir. Dönemsel net değişim veya bakiye için daima SUM(BORC) - SUM(ALACAK) formülü hesaplanmalıdır.


Dönemsel satış, stok devir hızı ve cari vade raporlarınızı hazırlarken SQL sözdizimiyle ve tarih kaçırma problemleriyle vakit kaybetmek zorunda değilsiniz. Erp Asistanı'na firmanızın veritabanını güvenle bağlayabilir, dilediğiniz raporu Türkçe konuşarak anında alabilirsiniz.

Ücretsiz üye olun, istediğiniz sorguyu doğal dille alın →

Bu yazıyı paylaş
Konuşarak raporlayın

Netsis'te SQL ve raporu konuşarak alın

Türkçe sorunuzu yazın, şemanıza uygun çalışan SQL'i ya da hazır uygulamanızı saniyeler içinde alın. Kredi kartı gerekmez.