İki tarih arasındaki farkı Yıl, Ay, Gün olarak bulmak.

İki tarih arasında geçen zamanı bulmanız, yaş hesaplamanız gerekebilir. Oracle’da iki tarih arasındaki farkı yıl, ay,gun olarak  veren fonksiyon bulunmamaktadır.

Ben aşağıdaki şekilde bir sql ile hallettim: 

SQL>SELECT
  DOG_TAR DOGUM_TARIHI,
TRUNC( MONTHS_BETWEEN( SYSDATE, dog_tar)/12) yil,
TRUNC( MOD( MONTHS_BETWEEN( SYSDATE, dog_tar),12) ) ay,
TRUNC( (MONTHS_BETWEEN(SYSDATE,dog_tar)- TRUNC(MONTHS_BETWEEN( SYSDATE, dog_tar))) /0.032258064516129) gun
FROM
  PERSONEL; 


DOGUM_TARIHI        YIL         AY        GUN
------------ ---------- ---------- ----------
11.04.1970           39          9         24
01.01.1960           50          1          3
01.01.1998           12          1          3
04.08.1997           12          6          0
13.02.1982           27         11         22

0.032258064516129 iki gün arasındaki fark.

SQL>SELECT MONTHS_BETWEEN( SYSDATE,SYSDATE-1) FROM DUAL;

MONTHS_BETWEEN(SYSDATE,SYSDATE
------------------------------
             0,032258064516129

İki tarih arasındaki farkı yıl,ay,gün,hafta olarak hesaplayan fonksiyon.

CREATE OR REPLACE FUNCTION "TARIH_HESAPLA"(BAS_TARIH DATE, BIT_TARIH DATE,FORMAT
   VARCHAR2 DEFAULT '%YIL% yil %AY% ay %AYGUN% gun')
   RETURN VARCHAR2 DETERMINISTIC IS
   SONUC VARCHAR2(100) ;
   FARK NUMBER;
BEGIN
   -- %YIL% : Iki tarih arasindaki fark yil olarak
   -- %AY% : Iki tarih arasindaki fark ay olarak
   -- %AYGUN% : Iki tarih arasindaki fark aydan kalan gun olarak
   -- %HAFTA% : Iki tarih arasindaki fark hafta olarak
   -- %HAFTAGUN% :Iki tarih arasindaki fark haftadan kalan gun olarak
   SONUC := FORMAT;
   FARK:=months_between(BIT_TARIH, BAS_TARIH);
   SONUC := REPLACE(SONUC,'%YIL%',trunc(fark / 12));
   SONUC := REPLACE(SONUC,'%AY%',trunc(mod(fark, 12)) );
   SONUC := REPLACE(SONUC,'%AYGUN%',trunc( (fark - trunc(fark) ) / 0.032258064516129));
   SONUC := REPLACE(SONUC,'%HAFTAGUN%',TRUNC(mod(BIT_TARIH-BAS_TARIH,7 )));
   SONUC := REPLACE(SONUC,'%HAFTA%',TRUNC( (BIT_TARIH-BAS_TARIH)/7 ));
   RETURN SONUC;
END;

Örnek:

SQL> select tarih_hesapla(sysdate-999,sysdate) from dual;

TARIH_HESAPLA(SYSDATE-999,SYSD
------------------------------
2 yil 8 ay 25 gun


SQL> select tarih_hesapla(sysdate-999,sysdate,'%YIL% Yil') from dual;

TARIH_HESAPLA(SYSDATE-999,SYSD
------------------------------
2 Yil


SQL> select tarih_hesapla(sysdate-100,sysdate,'%HAFTA% Hafta %HAFTAGUN% Gün') from dual;

TARIH_HESAPLA(SYSDATE-100,SYSD
------------------------------
14 Hafta 2 Gün

Flashback query ile sorgulama

Oracle’da tablolar ile  çalışırken,  tabloya ait daha önceki verilerini görmeniz gerekebilir. Tablo’nun belirli bir zamana ait verisini görmek için :

SELECT * FROM tabloadi AS OF TIMESTAMP TO_DATE('25.12.2009 15:00:00','DD.MM.YYYY HH24:MI:SS');

Sorgulama yaparken ORA-08186:invalid timestamp specified / ORA-08186:geçersiz zaman damgası belirlendi hatası alıyorsanız, sorguladığınız zaman aralığı flashback’te bulunmuyor demektir.

Linux üzerinde Oracle’ın otomatik olarak başlatılması

Oracle enterprise linux Release 5,Update 4. Oracle 11g R2 Enterprise versiyonunda uygulanmıştır.
Oracle’ın otomatik başlatılabilir olarak tanımlanması
root kullanıcısında, komut satırına :

vi /etc/oratab  

yazıp, oratab dosyasındaki  oracle_sid:oracle_home:<Y|N> formatında yazılmış satırdaki N’yi Y olarak değiştiriyoruz. Bu  değişiklik oracle’ın otomatik olarak başlatılması için gerekli.

orcl:/u01/app/oracle/product/11.2.0:Y

Ortam değişkenlerinin tanımlanması

vi /home/oracle/.bash_profile

yazıp,
# User specific environment and startup programs
satırından sonraki mavi renkli satırları ekleyiniz.

# .bash_profile


# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

ORACLE_HOSTNAME=localhost.localdomain; export ORACLE_HOSTNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID
ORACLE_TERM=xterm; export ORACLE_TERM
PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

if [ $USER = "oracle" ]; then
  if [ $SHELL = "/bin/ksh" ]; then
    ulimit -p 16384
    ulimit -n 65536
  else
    ulimit -u 16384 -n 65536
  fi
fi

Linux’servisinin oluşturulması
Bu kısımda linux’un her açılışında otomatik olarak çalıştıracağı bir dosya oluşturuyoruz.Bu dosya sistemin her  açılışında ve kapanışında çalıştırılacak.

vi /etc/init.d/oracledb

dosya içine

#!/bin/sh
# chkconfig: 345 99 10
# description: Oracle auto start-stop script.
#
# Set ORA_HOME to be equivalent to the $ORACLE_HOME
# from which you wish to execute dbstart and dbshut;
#
# Set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME.


ORA_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
ORA_OWNER=oracle
ORACLE_SID=orcl
export $ORACLE_SID

if [ ! -f $ORA_HOME/bin/dbstart ]

then
    echo "Oracle startup: cannot start"
    exit
fi

case "$1" in
    'start')
        # Start the Oracle databases:
        # The following command assumes that the oracle login
        # will not prompt the user for any values
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"
        su - $ORA_OWNER -c $ORA_HOME/bin/dbstart
        su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"  
        echo "OK"
        ;;
    'stop')
        # Stop the Oracle databases:
        # The following command assumes that the oracle login
        # will not prompt the user for any values
        su - $ORA_OWNER -c $ORA_HOME/bin/dbshut
        su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"
        ;;
esac

Ardından chmod komutu ile bu dosyanın yetki seviyesini 750 olarak ayarlıyoruz:

chmod 750 /etc/init.d/oracledb

chkconfig komutu ile bu script dosyasını linux servis’ine ekliyoruz :

/sbin/chkconfig --level 345 oracledb on

Oracle Enterprise Linux üzerine Oracle 11g R2 kurmak

Anlatılan OEL (Oracle Enterprise Linux) versiyonu Release 5, Update 4 tur.

İndirmek için : http://edelivery.oracle.com/linux

Oracle Database’in kurulumu sırasında yapmanız gereken paket kontrolü ve kullanıcı tanımlaması işlemlerinin OEL tarafından yapılmasını sağlayabilirsiniz. Bunun için kurulum sırasında  oracle-validated paketinin yüklenmesi gereklidir.

Paketin yüklenmesi için aşağıdakileri takip edin :

Kurulumda yazılım özellikleri ekranına geldiğinizde  “Customize Now” seçeneğini seçip Next’e  tıklayın.

oelinstall1

Sol taraftaki ekrandan “Base System” i seçip sağ taraftaki listeden “System Tools” seçin. “System Tools” un önündeki checkbox’a seçin sonra listenin altındaki “Optional Packages” butonunu tıklayın.

oelinstall2

oelinstall3

Listeyi aşağıya doğru kaydırın “oracle-validated” paketini seçip “Close” butonunu tıklayın

oelinstall4

OEL kurulduğunda oracle ile ilgili paketlerde yüklenmiş olacaktır.

Oracle veritabanı’nın kurulması.

Oracle kullanıcısındayken http://www.oracle.com/technology/software/products/database/index.html sayfasından
32 bit için:
linux_11gR2_database_1of2.zip
linux_11gR2_database_2of2.zip

64 bit için:
linux.x64_11gR2_database_1of2.zip
linux.x64_11gR2_database_2of2.zip

kurulum dosyalarını bilgisayarınıza (mesela: /home/oracle)indirin.

root kullanıcısında iken :

mkdir -p /u01/app/oracle
chown -R oracle:oinstall /u01
chmod 755 /u01/app/oracle

komutlarını verin.

oracle kullanıcısı olarak giriş yapın

Terminal pernceresi açıp dosyaları indirdiğiniz dizinde:

32 bit için: 

unzip -d db11gr2 linux_11gR2_database_1of2.zip
unzip -d db11gr2 linux_11gR2_database_2of2.zip
cd db11gr2/database
./runInstaller

64 bit için: 

unzip -d db11gr2 linux.x64_11gR2_database_1of2.zip
unzip -d db11gr2 linux.x64_11gR2_database_2of2.zip
cd db11gr2/database
./runInstaller

oracle kurulum perceresi açılmış olmalıdır.

İlgili linkler:
oracle-validate paketi
Installing Oracle 11gR2 on OEL 5.3
Oracle Enterprise Linux 5.1 Kurulumu
Oracle Enterprise Linux 5.1′e Oracle 10g Veritabanı Kurulumu
http://www.puschitz.com/InstallingOracle10g.shtml

Sequence değerini değiştirmek.

Oracle’da sequence’lerin değerini, increment değeri ile oynayarak değiştirmek mümkündür. sqx_test adında bir sequence oluşturup 1 olan sıra numarasını 500 olarak değiştiriyoruz.


SQL> create sequence sqx_test;

Sequence created

SQL> select sqx_test.nextval from dual;

NEXTVAL
----------
1

SQL> alter sequence sqx_test increment by 499;

Sequence altered

SQL> select sqx_test.currval from dual;

CURRVAL
----------
1

SQL> select sqx_test.nextval from dual;

NEXTVAL
----------
500

SQL> alter sequence sqx_test increment by 1;

Sequence altered
SQL>

Excel’de sayı sistemleri…

Excel’de 32 lik sayı sisteminden 10’luk sayı sistemine çevirmek için aşağıdaki fonksiyon kullanılabilir :

Türkçe Excel:

=EĞER(A1="";"0";TOPLA.ÇARPIM( KUVVET(32;UZUNLUK(A1) - SATIR( DOLAYLI("1:"&UZUNLUK(A1))));(KOD(BÜYÜKHARF(PARÇAAL(A1;SATIR(DOLAYLI("1:"&UZUNLUK(A1)));1))) -48*(KOD(PARÇAAL(A1;SATIR(DOLAYLI("1:"&UZUNLUK(A1)));1))<58) -55*(KOD(PARÇAAL(A1;SATIR(DOLAYLI("1:"&UZUNLUK(A1)));1))>64))))

İngilizce Excel:

=IF(A1="","0",SUMPRODUCT( POWER(32,LEN(A1) - ROW(INDIRECT("1:"&LEN(A1)))),
(CODE(UPPER(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))) - 48*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<58) - 55*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>64))))

asp.net’te web.config’ten parametre okumak

asp.net ile uygulama geliştirirken, uygulamanın parametrik olmasını isteyebilirsiniz. Bunun için web.config dosyasında appSettings alanı içerisine ihtiyaç duyduğunuz parametreleri şu şekilde tanımlamalısınız :

<appSettings>
<add key="username" value="kullaniciadi" />
<add key="password" value="pass" />
</appSettings>

program içerisinden bu değerleri okumak için :


Username = ConfigurationSettings.AppSettings["username"];
Password = ConfigurationSettings.AppSettings["password"];

Delphi ile web servis’e parametre gönderim problemi

ASP.NET (VS 2005) ile oluşturulmuş bir web servisine parametre gönderemedim. Parametresiz olarak çağırıldığında problem yok, parametre ile çağrıldığında, parametre değeri olarak null gidiyor ve “Value cannot be null” hatası alınıyor. 

Delphi ile oluşturulan kod içerisine

initialization

InvRegistry.RegisterInterface(TypeInfo(SoapAdi), 'http://tempuri.org/', 'utf-8');

altına:

InvRegistry.RegisterInvokeOptions(TypeInfo(SoapAdi), ioDocument);

satırını ekleyince problem çözüldü.