24 Nisan 2012 Salı

SQL Computed Column ile Ayrıntılı Tarih Tablosu

Peş peşe yayınlarımdan da farkedileceği üzere bugünlerde raporlarla başım dertte.. Hiç de sevmem kendilerini ama ne yapalım ekmek parası :)
Rapor yaparken yaparken yine bir gün müdürüm yanıma geldi ve ayrıntılı tarih tablosunun raporlarda gerekli olacağını söyledi. Hatta sonraki zamanlarda resmi tatil günlerini içerecek bir tablo yapacağımızın da sinyalini verdi.. Resmi tatil günleri muhtemelen manuel bir tablo olacak ama ayrıntılı tarih tablosu dediğim olay çok hoş :)
Şöyle ki SQL in computed Column özelliğini kullanmak bu tabloyla nasip oldu ve hoşuma da gitti..

Tablomun create scripti şu :

USE [Database]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TARIH_TANIM](
    [TARIH] [date] NOT NULL,
    [GUN]  AS (datepart(day,[TARIH])),
    [AY]  AS (datepart(month,[TARIH])),
    [CEYREK]  AS (datepart(month,[TARIH])/(4)+(1)),
    [YIL]  AS (datepart(year,[TARIH])),
    [HAFTA_GUN]  AS (case when datepart(weekday,[TARIH])=(1) then (7) else datepart(weekday,[TARIH])-(1) end),
 CONSTRAINT [PK_TARIH_TANIM] PRIMARY KEY CLUSTERED
(
    [TARIH] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Biz scriptle değil, tablo oluştururken kolon ayarlarından Computed Column Specification -> (Formula) alanını kullanarak formülleri ekledik .. En çok ilgimi çeken formüller Pazarı 7. gün yapan ve yılın çeyreklerini hesaplayan formüldü.. Neyse, tablomuz hazır..

Ama bitmedi ya içini nasıl dolduracağız?
ASP.NET te basit bir kod işimizi görür.. :

using System;
using _7GEN.Data;

public partial class lab_tarih_doldur : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var sql = new SQL(ExceptionBehaviour.Throw);// burası bizim projeye özel bir sınıf.. Ayrıca kullanmak istersek sql bağlantılarımızı kendimiz karşılamak zorundayız :)

        var tarih = DateTime.Now.AddYears(5).Date;

        while (DateTime.Now.AddYears(-10) < tarih)
        {
            var command = sql.CreateCommand("INSERT INTO TARIH_TANIM(TARIH) VALUES (@TARIH)");

            sql.AttachParameter(command, "@TARIH", tarih);

            sql.Execute(command);

            tarih = tarih.AddDays(-1);
        }
    }
}

Bu kadar basitmiş..
Mutlaka aynılarının daha güzelleri yapılabiliyordur ama JAVA ve ORACLE saplantılı aşkından sonra .NET ve SQL e ısınmaya mı başlayacağım ne? :)

Kısmet..

Hiç yorum yok:

Yorum Gönder