Logo Go3 ve Logo Tiger3 veritabanlarına aşina olan veya SQL Raporlama ile uğraşan insanlar, logodaki bazı tarih ve zamansal bilgilerin veritabanındaki karşılığının integer olarak tutulduğunu görmüşlerdir. Bu yazıda integer değerlerin nasıl tarih ve zaman formatına çevrildiğini anlatacağım.
Logo TIME ve FTIME alanları
Logo veritabanındaki TIME ve FTIME alanları genellikle zaman bilgisini tutar. Yani burada işlem yapılan tarih değil, o tarihe ait zaman (saat:dakika:saniye) tutulur. Buradaki integer değerin time formatındaki karşılığını bulmak için aşağıdaki fonksiyon kullanılır.
CREATE FUNCTION [dbo].[LG_TIMETOINT](@HH INT,@MM INT,@SS INT)
RETURNS INT
AS
BEGIN
DECLARE @TIME INT
SELECT @TIME = (@HH*65536*256+@MM*65536+@SS*256)
RETURN(@TIME)
END
Bu işlemin tersi ise, yani saat:dakika:saniye formatındaki bir değerin logo time formatındaki integer değerine ulaşmak için aşağıdaki fonksiyon kullanılır.
CREATE FUNCTION [dbo].[LG_INTTOTIME](@TIME INT)
RETURNS VARCHAR(8)
AS
BEGIN
DECLARE @HH INT
DECLARE @MM INT
DECLARE @SS INT
SELECT @HH = @TIME/65536/256
SELECT @MM = (@TIME/65536) - (@HH*256)
SELECT @SS = (@TIME/256) - (@HH*65536) - (@MM*256)
RETURN (RIGHT('0'+CAST(@HH AS VARCHAR(2)),2)+':'+RIGHT('0'+CAST(@MM AS VARCHAR(2)),2)+':'+RIGHT('0'+CAST(@SS AS VARCHAR(2)),2))
END
GO
Logo DATE alanları
Yukarıdaki açıklama ile paralel bir şekilde, logo veritabanındaki bazı date alanlar, integer tipinde tutulur. Buradaki integer değerin date karşılığını görmek için aşağıdaki fonksiyon kullanılır.
CREATE FUNCTION [dbo].[LG_INTTODATE] (@DEGER INT)
RETURNS datetime
AS
BEGIN
DECLARE @GUN VARCHAR(2), @AY VARCHAR(2), @YIL VARCHAR(4)
DECLARE @SONUC datetime
SELECT
@GUN=CAST((CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)-(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/256*256)) AS VARCHAR(3))
SELECT
@AY=CAST(((CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)-(65536*(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/65536)))-(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)-(CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/256*256)))/256 AS VARCHAR(3))
SELECT
@YIL=CAST((CONVERT(INT,CONVERT(BINARY,@DEGER,2),0)/65536) AS VARCHAR(6))
SET @GUN=CASE WHEN LEN(@GUN)<2 THEN '0'+@GUN ELSE @GUN END
SET @AY=CASE WHEN LEN(@AY)<2 THEN '0'+@AY ELSE @AY END
SONUC:
IF @DEGER<>0
BEGIN
SET @SONUC=CONVERT(DATETIME, @YIL + '-' + @AY + '-' + @GUN + ' 00:00:00', 102)
END
IF @DEGER=0
SET @SONUC= NULL
RETURN @SONUC
END
GO
Bu işlemin tersi ise, yani datetime şeklindeki bir verinin integer karşılığını bulmak için de aşağıdaki fonksiyon kullanılır.
CREATE FUNCTION [dbo].[LG_DATETOINT] (@date DATETIME)
RETURNS INT
AS
BEGIN
DECLARE @GUN INT, @AY INT, @YIL INT
DECLARE @SONUC INT
SET @YIL = YEAR(@date)
SET @AY = MONTH(@date)
SET @GUN = DAY(@date)
SET @SONUC = (@YIL * 65536) + (@AY * 256) + @GUN
IF @SONUC = 0
SET @SONUC = NULL
RETURN @SONUC
END
GO
Fonksiyonların kullanımı ve örnek uygulamalar için aşağıdaki videoyu izleyebilir, bu tarz videolardan haberdar olmak için kanalıma abone olabilirsiniz.