1

Konu: tablo içinde olmayan tarihleri bulmak

ürt..gider tablosunda gün atlanmamsı gerekiyor, o nedenle bir kontrol yapıyorum - kayıtsız gün var ise kaydetmek için. (örnekte 2010 için,iki tarih aralığı da girilebilinir.)
aşağıdaki kodu çıkardım, daha basit bir yol var mı ?

SQL
CREATE TABLE ##mintegers (i integer not null primary key);

INSERT INTO ##mintegers (i) values
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
--select * from ##mintegers
 
SELECT CAST(DATEADD(day, (H100.i*100  + H10.i*10 + H1.i*1 ) , '2010-1-1') AS DATE) AS xdate
  FROM ##mintegers as H100
CROSS JOIN ##mintegers as H10
CROSS JOIN ##mintegers as H1
WHERE YEAR(DATEADD(day, (H100.i*100  + H10.i*10 + H1.i*1 ) ,'2010-1-1'))=2010
AND CAST(DATEADD(day, (H100.i*100  + H10.i*10 + H1.i*1 ) , '2010-1-1') AS DATE) NOT IN (SELECT tarih FROM ürt..gider)
VFP9 SP2

2

Re: tablo içinde olmayan tarihleri bulmak

Genelde ustalarin onerdigi bir kenarda daima "Tally" tablolarinin tutulmasi. Iki tane. Birisi 1...10000000 gibi integer degerler iceriyor, digeride hatiri sayilir bir araliktaki tarihleri. Eger tutmuyorsan (ben tutmuyorum) gerektiginde yaratmak icin mevcut tablolari kullanabilirsin:

-Integer: 0-999 arasinda 1000 tane

SQL
SELECT TOP 1000

  (ROW_NUMBER() OVER (ORDER BY t1.Object_ID) - 1)
FROM Master.sys.All_Columns t1
    CROSS JOIN Master.sys.All_Columns t2

-Bunu seninkine uyarlarsak 2010-1-1'den itibaren 1000 gun:

SQL
SELECT TOP 1000

  DATEADD(day, (ROW_NUMBER() OVER (ORDER BY t1.Object_ID) - 1) ,'2010-1-1') AS xDate
FROM Master.sys.All_Columns t1
    CROSS JOIN Master.sys.All_Columns t2

2010 yili:

SQL
SELECT xDate

FROM
(SELECT TOP 1000
  DATEADD(day, (ROW_NUMBER() OVER (ORDER BY t1.Object_ID) - 1) ,'2010-1-1') AS xDate
FROM Master.sys.All_Columns t1
    CROSS JOIN Master.sys.All_Columns t2) tmp
WHERE YEAR(tmp.xDate) = 2010

-Iki tabloyu birlestirip sonuc


-- Yil parametrik olsa iyi olur gibi

SQL
DECLARE @yil INTEGER

SET @yil = 2000
 
SELECT  xDate
FROM    ( SELECT TOP 1000
                    DATEADD(day,
                            ( ROW_NUMBER() OVER ( ORDER BY t1.Object_ID ) - 1 ),
                            CAST(cast(@yil AS CHAR(4)) + '-1-1' AS DATETIME)) AS xDate
          FROM      Master.sys.All_Columns t1
                    CROSS JOIN Master.sys.All_Columns t2
        ) tmp
        LEFT JOIN ürt..gider ON tarih = xDate
WHERE   YEAR(tmp.xDate) = @yil
        AND tarih IS NULL
ORDER BY xDate