29 Eylül 2016 Perşembe

SQL' de TARİH İŞLEMLERİ


PostgreSql'de Tarih İşlemleri:

PostgreSql'de Tarih İşlemleri ile İlgili En Çok  Kullanılan Fonksiyonlar ve Örnek Kullanımları: 


SELECT CURRENT_DATE+INTERVAL '1 day';
--- Şuanki tarihin 1 gün sonrasını verir.  '+' yerine '-' kullanıldığında şuanki tarihin 1 gün öncesini verecektir. 1 yerine girilecek sayı kadar şuanki tarihin sonrası veya öncesine göre işlem yapmak mümkündür. Tablo sorgusu üzerinde kullanımı ise;

 (select tarihlerin_yeraldigi_kolon_adi-interval '1 day' from tablo_adi) şeklinde yazılırsa tablodaki ilgili tarihlerin 1 gün öncesini listeleyecektir.

Ayrıca sorguda gün yerine ay, yil üzerinde aynı işlemleri yapmak mümkün bunun örnek gösterimi aşağıdaki gibidir:

select current_date+interval '1 month'; --- Şuanki tarihin 1 ay sonrasını verir.
select current_date+interval '1 year'; --- Şuanki tarihin 1 yıl sonrasını verir.

SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
---- Tanımlanan tarihin gününü verir. Sonuç:16

Sorguda 'DAY' yerine 'MONTH' ,'YEAR', 'HOUR', 'MINUTE' girildiğinde tanımlanan tairihin ay,yıl, saat veya dakika verisini döndürür. Kullanım şekilleri şöyle:

- Select extract(month from timestamp '2001-02-16 20:38:40'); --- Sonuç:2 (ay)
- Select extract(year from timestamp '2001-02-16 20:38:40'); ---Sonuç:2001 (yıl)
- Select extract(hour from timestamp '2001-02-16 20:38:40'); ---Sonuç:20 (saat)
- Select extract(minute from timestamp '2001-02-16 20:38:40');

SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
--- Tanımlanan tarihte yılın onluk kısmına kadar olanını döndürür. Sonuç: 200


SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
--- Tanımlanan tarihin haftanın kaçıncı gününe denk olduğunu döndürür. Sonuç:5 (0-pazar, 1 p.tesi,...6 c.tesi olarak tanımlıdır.)

SELECT EXTRACT(DOY FROM TIMESTAMP '2001-03-25 20:38:40');
--- Tanımlanan tarihin yılın kaçıncı gününe denk olduğunu döndürür. Sonuç:84


SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
--- Tanımlanan tarihin ay değerinin yıla bölümünden kalanı verir. Sonuç:1



SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');

--- Tanımlanan tarihin saat başlangıcını verir. Sonuç:2001-02-16 20:00:00
'hour' yerine 'month' veya 'year' girildiğinde ay veya yılın başlangıç değerini veir.

    - SELECT date_trunc('month', TIMESTAMP '2001-02-16 20:38:40'); --- Sonuç:"2001-02-01 00:00:00"

   - SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40'); --- Sonuç:"2001-01-01 00:00:00"



SELECT TIMESTAMP 'now';
--- Sistem tarihini döndürür. Sonuç: 2016-09-29 03:26:38.876368



SELECT timeofday();

 --- Güncel tarihin ay ve gün karşılığını verir. Sonuç: "Thu Sep 29 03:28:50.899577 2016 BRT"



SELECT LOCALTIMESTAMP;

--- Güncel tarihi tarih ve saat olarak verir. Sonuç: 2016-09-29 03:31:52.407552


PostgreSql'de Tarih Farkı:

SELECT DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date);
--- Tanımlanan iki farklı tarihin yıl olarak farkını döndürür. Sonuç:1
SELECT (DATE_PART('year', '2012-01-01'::date) - DATE_PART('year', '2011-10-02'::date)) * 12 +
        (DATE_PART('month', '2012-01-01'::date) - DATE_PART('month', '2011-10-02'::date));

--- Tanımlanan iki farklı tarihin ay olarak farkını döndürür. Sonuç:3

SELECT '2011-12-31 01:00:00'::timestamp - '2010-09-17 23:00:00'::timestamp; 

--- Tanımlanan iki farklı tarihin gün olarak farkını gün ve saat olarak döndürür. Sonuç: "469 days 02:00:00"


SELECT DATE_PART('day', '2011-12-31 01:00:00'::timestamp - '2011-12-29 23:00:00'::timestamp); 

  --- Tanımlanan iki farklı tarihin gün olarak farkını gün sayısı olarak döndürür. Sonuç: 1        

  Örnek olarak tablolarda kullanımı şu şekildedir:

 Select DATE_PART('day',guncel_tarih_kolon_adi::timestamp - giris_tarihi_kolon_adi::timestamp) from tablo_adi;










27 Eylül 2016 Salı

Veritabanı Tablo Sorgulamaları


Veritabanında Kolon İsmi Aratma:

Herhangi bir kolonun hangi tabloya ait olduğunu bulmak için girilen kolon ismini veritabanında yer alan tüm tablolarda aratmak için şöyle bir search sql cümlesi yazmalıyız:

SELECT * FROM information_schema.columns WHERE TRUE AND table_schema = 'public'
AND column_name ~* 'aratılmak istenen kolon ismi'




Veritabanında Birden Fazla Kayıt İçeren Tablo İsimlerini Aratma :

SELECT
  pgClass.relname   AS tableName,
  pgClass.reltuples AS rowCount
FROM
  pg_class pgClass
LEFT JOIN
  pg_namespace pgNamespace ON (pgNamespace.oid = pgClass.relnamespace)
WHERE
  pgNamespace.nspname NOT IN ('pg_catalog', 'information_schema') AND
  pgClass.relkind='r' AND pgClass.reltuples>0 AND pgClass.relname ilike 'ad%'


Yukarıdaki sorguda, veritabanında ismi 'ad ' ile başlayan, bir ve birden fazla kayıt içeren tabloların listelenmesi sağlanır.








22 Eylül 2016 Perşembe

PHP Kodunun HTML'de Kullanımı

<body>
<form method="post" action="webPHP.php">--- form etiketinin tanımında metod tipinin post olarak tanımlanması ayrıca action ayarının form üzerindeki işlemlerin hangi php sayfasından beslendiğini gösterdiği için bu ayara dikkat etmek gerekir. Benim bu uygulamamda html kodu ile php kodu içiçe olduğundan sayfayı kendi içine post ettiğimden üzerinde çalıştığım dosyanın uzantısı php olacaktır. Böylece üzerinde çalıştığım dosyanın adını yazmam gerekiyor.

<table border="1" cellspacing="2" cellpadding="2">
<tr style="height:5px;">
<td style="height:5px;">
<font size="2" color="lightgreen">
<label for="ok"><?php echo $msg; ?></label> --- label nesnesinin tanımlanması ve php kodu ile değişkenin label nesnesine tanımlanması
</font>
</td>
<td style="height:5px;">
<font size="3" color="darkred"> Giriş için Başlık Tanımı</font>
</td>
</tr>
         <tr width="%100">
         <td width="%20">Yil:</td>
         <td width="%80">
<select name="yillar" id="id"> ----- combobox nesnesinin tanımlanması id="id" olmasına dikkat edilir.
  <option id="0">Lutfen yil seciniz</option> --- combobox ilk satırının ayarlanması (id="0" olmasına dikkat edilir.)
  <?php
   $sql=pg_query("SELECT * FROM dynyil ORDER BY yil");----sql ifadesinin $sql değişkenine bağlanması (<?php --- ?> arasına combox html kodunun içine yazılır.)

   while ($rows = pg_fetch_array($sql)) ---- $sql değişkenine atanan postgresql cümleciğinin fieldlara ayrılarak teker teker $rows değişkenine atanması
   {
    $id=$rows['oid']; --- $rows değişkeninin tuttuğu postgresql cümleciğinden istenen alanların değişkenlere aktarılması
    $yil=$rows['yil'];
    ?>
  <option id="<?php echo $id ?>"> <?php echo $yil ?></option> ---- değişkene bağlı istenen fieldların combobox'da listelenmesi (burada da $id ' e dikkat edilir.)
   <?php
    }
    $selectedyil=$_POST['yillar'];----- burada kullanıcının combobox'ta güncel olarak seçmiş olduğu kayıt $selectedyil değişkeninde tutulur
   ?> ---PHP kodunun bittiğini gösterir
  </select>
</td>
         </tr>
         <tr width="%100">
         <td width="%20">Donem:</td>
         <td width="%80">
<select name="aylar" id="iday">
  <option id="0">Lutfen ay seciniz</option>
  <?php
   $sql=pg_query("SELECT * FROM dynay ORDER BY aylar asc");

   while ($rows = pg_fetch_array($sql))
   {
    $id=$rows['oid'];
    $ay=$rows['aylar'];
    ?>
  <option id="<?php echo $id ?>"> <?php echo $ay ?></option>
 
   <?php
   }
    $selecteday=$_POST['aylar'];
   ?>
  </select>
</td>
         </tr>
         <tr width="%100">
         <td width="%20"></td>
         <td width="%80">
<input type="submit" name="guncelle" value="Guncelle"> --- button nesnesinin tanımlanması burada name'e dikkat edilir.

<?php --- PHP kodunun başladığını gösterir
 if(isset($_POST['guncelle']))--- button'a tıklandığında yapılacaklar
 {
   $yil=$selectedyil; --- combobox'tan seçilen kaydın $yil değişkenine aktarılması
   $donem=$selecteday;
   $sql=pg_query("UPDATE STDSBSCORECARD SET NRPERIOD='$donem',NRYEAR='$yil'");
   $guncelle = pg_query($db, $sql);
   if(!$sql){ ---- postgresql cümleciğinin sağlanmadığı durumda ...
      echo '<font size="2" color="darkred">
      Kayit Guncelleme Basarisiz..!
      </font>';
   } else { ---- postgresql cümleciğinin sağlandığı durumda...
      echo '<font size="2" color="lightgreen">
      Kayit Basariyla Guncellendi..
      </font>';
   }
   pg_close($db);
 }
?> ---PHP kodunun bittiğini gösterir
</td>
         </tr>
</table>
</form>
</body>

PHP de PostgreSql Veritabanına Bağlanma


PHP de PostgreSql Veritabanına Bağlanmak:

PHP kodu HTML koduna entgre kullanılabilen esnek bir dildir. php kodu <?php ---- ?> etiketleri arasına yazılır. Aşağıda görüldüğü gibi öyle kullanılmıştır. Bu etiketler sayesinde php kodunu html kodu içerisinde gömülü ve aynı zamanda html kodundan bağımsız çalışacak şekilde kullanabiliyoruz.

PostgreSql Veritabanına Bağlanma Örneği:

 <?php  
   $host        = "host=*.*.*.*"; --- uzak veritabanının sunucu adresinin host değişkenine bağlanması
   $port        = "port=5432"; --- port ayarlama
   $dbname      = "dbname=veritabanı_adi";---veritabanı adının dbname değişkenine bağlanması
   $credentials = "user=***** password=******";---veritabanına erişim bilgilerinin tanımlanması

   $db = pg_connect( "$host $port $dbname $credentials"  );--- veritabanı bağlantı bilgilerinin $db değişkenine tanımlanması
 

   if(!$db) // veritabanına bağlanma durumunu kontrol et
  {
      echo "Error : Unable to open database\n"; ---bağlanamama durumunda echo ile ekrana uyarı yazdırma
   } else {
      $msg="OK";  --- veritabanına başarılı şekilde bağlanma durumunda label nesnesine aktarılmak üzere $msg değişkenine "OK" mesajı tanımlama
   }

 ?> --- HTML tasarım kodlarının içerisindeki php kodunun bittiğini gösterir.
 

8 Eylül 2016 Perşembe

SQL'de Join, Update ve En Son Eklenen Kaydın Döndürülmesi



SQL'de Join ve Update Birlikte Kullanımı:

Elimizde WFPROCATTRIB adında bir tablo olsun. Bu tablonun NMSTRING adındaki kolon datalarını  DYNANAFORM ve WFPROCATTRIB adlarındaki tablolara bağlı olarak güncellemek istiyoruz. Bunun için UPDATE sorgumuzun içerisinde DYNANAFORM ve WFPROCATTRIB adlarındaki tabloların JOIN sorgusunu kullanmamız gerekiyor. Bu işlemi yapabilmek için WFPROCATTRIB adındaki tablonun güncellemek istediğimiz NMSTRING adındaki kolonu aşağıda görüldüğü gibi direkt WFPROCATTRIB,DYNANAFORM ve WFPROCATTRIB adlarındaki bu 3 tablonun birbirine bağlı olduğu JOIN sorgusunun döndürdüğü değerlerle güncelleyebiliriz. Aynı zamanda  WFPROCATTRIB adındaki tablonun UPDATE sorgusuna başka bir tabloya dayalı bir koşul yazmak istediğimizde UPDATE set ayarından sonra FROM ile devam ettirerek aşağıdaki örnekte olduğu gibi WFPROCESS adındaki tabloya atayacağımız koşula göre  UPDATE sorgumuzu istediğimiz bir koşula göre yazabiliriz.

UPDATE WFPROCATTRIB WFATB set NMSTRING=(SELECT FIRMAADI FROM DYNANAFORM DYNFRM JOIN WFPROCESS WFPRS ON DYNFRM.SURECID=WFPRS.IDPROCESS JOIN WFPROCATTRIB WFATB ON WFPRS.IDOBJECT=WFATB.IDPROCESS ORDER BY SURECID DESC LIMIT 1) FROM WFPROCESS WFPRS WHERE WFATB.CDATTRIBUTE=24 AND WFATB.IDPROCESS=(SELECT WFPRS.IDOBJECT FROM DYNANAFORM DYNFRM JOIN WFPROCESS WFPRS ON DYNFRM.SURECID=WFPRS.IDPROCESS JOIN WFPROCATTRIB WFATB ON WFPRS.IDOBJECT=WFATB.IDPROCESS ORDER BY SURECID DESC LIMIT 1);

SQL'de Tabloya Eklenen En Son Kaydı Döndürmek:

SELECT WFPRS.IDOBJECT FROM DYNANAFORM DYNFRM JOIN WFPROCESS WFPRS ON DYNFRM.SURECID=WFPRS.IDPROCESS JOIN WFPROCATTRIB WFATB ON WFPRS.IDOBJECT=WFATB.IDPROCESS ORDER BY SURECID DESC LIMIT 1



5 Eylül 2016 Pazartesi

PostgreSql'de Trigger ile Update İşlemleri

PostgreSql'de Trigger Yazmak:

CREATE TRIGGER check_update
AFTER UPDATE
ON denemetable
FOR EACH ROW
EXECUTE PROCEDURE check_account_update();

Burada "denemetable" adındaki tabloyu update ettiğimizde trigger, "check_account_update()" adlı fonksiyonu tetikler.
After Update : "denemetable" adlı tabloda güncelleme yapıldıktan 'sonra' "check_account_update()" adlı fonksiyon tetiklenir.
Before Update : "denemetable" adlı tabloda güncelleme yapılmadan 'önce' "check_account_update()" adlı fonksiyon tetiklenir.
After Insert :  "denemetable" adlı tabloya kayıt ekleme yapıldıktan 'sonra' "check_account_update()" adlı fonksiyon tetiklenir.
Before Insert :  "denemetable" adlı tabloya kayıt ekleme yapılmadan 'önce' "check_account_update()" adlı fonksiyon tetiklenir.
After Delete :  "denemetable" adlı tablodan kayıt silme işlemi yapıldıktan 'sonra' "check_account_update()" adlı fonksiyon tetiklenir.
Before Delete :  "denemetable" adlı tablodan kayıt silme işlemi yapılmadan 'önce' "check_account_update()" adlı fonksiyon tetiklenir.

Aynı Anda Birden Fazla Update Sorgusunu Çalıştıran "check_account_update()" Trigger Fonksiyonu:

CREATE OR REPLACE FUNCTION fonks() RETURNS TRIGGER AS $update$
DECLARE BEGIN

update STSCSTRUCTARGET set vlperup=(vlpoints*100/4) where (cdrangeitem=203 or cdrangeitem=200 or cdrangeitem=201 or cdrangeitem=202 or cdrangeitem=204);

Update STSCSTRUCTARGET set cdrangeitem=204 where vlperup<40 and (cdrangeitem=203 or cdrangeitem=200 or cdrangeitem=201 or cdrangeitem=202 or cdrangeitem=204);

Update STSCSTRUCTARGET set cdrangeitem=203 where vlperup>=40 and vlperup<70 and (cdrangeitem=203 or cdrangeitem=200 or cdrangeitem=201 or cdrangeitem=202 or cdrangeitem=204);

Update STSCSTRUCTARGET set cdrangeitem=202 where vlperup>=70 and vlperup<90 and (cdrangeitem=203 or cdrangeitem=200 or cdrangeitem=201 or cdrangeitem=202 or cdrangeitem=204);

Update STSCSTRUCTARGET set cdrangeitem=201 where vlperup>=90 and vlperup<115 and (cdrangeitem=203 or cdrangeitem=200 or cdrangeitem=201 or cdrangeitem=202 or cdrangeitem=204);

Update STSCSTRUCTARGET set cdrangeitem=200 where vlperup>=115 and (cdrangeitem=203 or cdrangeitem=200 or cdrangeitem=201 or cdrangeitem=202 or cdrangeitem=204);

update STSCSTRUCTARGET set VLPERUPACCUM=(vlpointsaccum*100/4) where (cdrangeitemaccum=203 or cdrangeitemaccum=200 or cdrangeitemaccum=201 or cdrangeitemaccum=202 or cdrangeitemaccum=204);

Update STSCSTRUCTARGET set cdrangeitemaccum=204 where VLPERUPACCUM<40 and (cdrangeitemaccum=203 or cdrangeitemaccum=200 or cdrangeitemaccum=201 or cdrangeitemaccum=202 or cdrangeitemaccum=204);

Update STSCSTRUCTARGET set cdrangeitemaccum=203 where VLPERUPACCUM>=40 and VLPERUPACCUM<70 and (cdrangeitemaccum=203 or cdrangeitemaccum=200 or cdrangeitemaccum=201 or cdrangeitemaccum=202 or cdrangeitemaccum=204);

Update STSCSTRUCTARGET set cdrangeitemaccum=202 where VLPERUPACCUM>=70 and VLPERUPACCUM<90 and (cdrangeitemaccum=203 or cdrangeitemaccum=200 or cdrangeitemaccum=201 or cdrangeitemaccum=202 or cdrangeitemaccum=204);

Update STSCSTRUCTARGET set cdrangeitemaccum=201 where VLPERUPACCUM>=90 and VLPERUPACCUM<115 and (cdrangeitemaccum=203 or cdrangeitemaccum=200 or cdrangeitemaccum=201 or cdrangeitemaccum=202 or cdrangeitemaccum=204);

Update STSCSTRUCTARGET set cdrangeitemaccum=200 where VLPERUPACCUM>=115 and (cdrangeitemaccum=203 or cdrangeitemaccum=200 or cdrangeitemaccum=201 or cdrangeitemaccum=202 or cdrangeitemaccum=204);
RETURN NULL;


END;
$update$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


4 Eylül 2016 Pazar

CSV Dosyasını PostgreSql'e Import Etmek


CSV dosyasını postgreSql'e import etmek için kod ve PgAdmin paneli üzerinden farklı olarak iki yol izlenerek yapılabilir.

PgAdmin paneli üzerinden CSV Dosyasını İmport Etmek:

bu işlem için csv dosyasının başlığındaki (header kısmı) isimler tablonun column isimlerini oluşturacak şekilde yeni bir tablo oluşturulur. oluşturulacak yeni tablonun kolon sayısı csv dokümanındaki header isimlerinin sayısı kadar olmalıdır. yeni tablo oluştururken csv'nin header ksımındaki isimlerin altındaki verilerin tipine göre column veri tipi ayarlanır. daha sonra yeni oluşturulan tablonun üzerine sağ tıklanarak gelen ekrandaki "import" sekmesine tıklanır. Açılan pencerede Fileoptions tabının; Filename kısmı için import etmek istediğimiz CSV dosyasının yolu seçilir, Format için csv seçeneği seçilir, Encoding için WIN1251 seçeneği seçilir. Daha sonra alttaki sekmelerden devam edilir,Columns tabında ekranda yer alan kolon isimlerinin seçili olması gerekir, Misc.Option tabının Header ksımı tıklanır, Delimiter kısmı CSV dosyasındaki verilerin hangi işaretlerle birbirinden ayrıldığına dair ayarlama yapılır,  csv dosyasındaki veriler arasında ";" "," "tab" bunlardan hangisi ile dolaşabiliyorsak onu işaretleyerek import edebiliriz.


SQL Editör üzerinden CSV Dosyasını Tabloya İmport Etmek:

CREATE TABLE denemetable (
isim char(50)
yas integer
cinsiyet char(20)
meslek char(50)
);
csv header'daki verilere göre yeni tablo oluşturulur.

COPY denemetable FROM 'C:/Users/dell-/Desktop/Satınalma.csv' DELIMITER ',' CSV HEADER;

import edilmek istenen CSV dosyasının pc deki yolu yukarıdaki koddaki gibi belirtilerek yeni oluşturduğumuz tabloya kopyalanır. DELİMİTER csv dosyasındaki verilerin hangi karaketerlerle ayrıldığı göstermek için kullanılır.