Güncel tarihi nasıl almamalı, nasıl almalı?

Yeni tanımlanan bir DATETIME değişkeninin varsayılan değeri, tanımlandığı andır — bu yüzden bazı geliştiriciler güncel tarihi almak için sadece boş bir DATETIME değişkeni tanımlar. Bu güvenilir bir yöntem değildir. Doğru yol, her okunduğunda güncel zamanı veren sistem değişkeni SYS_CURRENTDATE'i kullanmaktır:

LOCAL:
    DATETIME SIMDI;

SIMDI = SYS_CURRENTDATE;

NULLDATE nedir?

Bir dialog'daki tarih alanı boş bırakılırsa, karşılık gelen değişken NULLDATE adı verilen özel bir değere düşer (ekranda ../../ .. :: .. gibi görünür). Bunu tespit etmek için NULLDATE() fonksiyonu kullanılır:

IF NULLDATE(BASLANGICTARIHI) THEN
    MESSAGE BAS E100 WITH;
    RETURN;
ENDIF;

Benzer şekilde SYS_MINDATE/SYS_MAXDATE ile sistemin alt/üst tarih sınırlarına, ISMINDATE()/ISMAXDATE() ile bir değerin bu sınırlardan biri olup olmadığına erişilir.

Formatlama ve fark hesaplama

Bir tarihi belirli bir biçimde metne çevirmek için FORMATDATE(), tersi yönde bir metni tarihe çevirmek için PARSEDATE() kullanılır:

LOCAL:
    STRING METIN;

METIN = FORMATDATE(SYS_CURRENTDATE, 'yyyy.MM.dd');

İki tarih arasındaki farkı milisaniye cinsinden almak için doğrudan çıkarma (-) yeterlidir; dakika cinsinden fark için GETMINUTEDIFF() fonksiyonu daha okunaklıdır. Ayrıca ADDDAYS, ADDMONTHS, SUBDAYS gibi fonksiyonlar artık/eksik yıl (leap year) hesaplarını sizin yerinize yapar.

Sunucu tek zaman dilimi tutar, kullanıcı kendi diliminde görür

CANIAS, tarihleri veritabanında tek bir sabit zaman diliminde (Database Timezone) saklar; her kullanıcı ekranında kendi tanımlı zaman dilimine göre görür. Bu ayrım sayesinde farklı ülkelerdeki kullanıcılar aynı kaydı kendi saatlerine göre okur — ama veritabanı zaman dilimini sonradan değiştirmek, mevcut tüm tarihlerin anlamını bozacağından kesinlikle planlı bir veri göçü olmadan yapılmamalıdır.

Sonuç

Güncel tarih için her zaman SYS_CURRENTDATE, boş tarih kontrolü için NULLDATE() — bu iki alışkanlık, TROIA'da tarih kaynaklı hataların büyük kısmını baştan önlüyor.