FireBird --> Cast ile integeri date e çevirme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

FireBird --> Cast ile integeri date e çevirme

Mesaj gönderen aslangeri »

Merhaba Arkadaşlar.
Firebird veritabanına kayıtları aktarırken date alanını yanlışlıkla integer bir alana aktarmışım. :oops:
Bunu sql ile düzeltiyim dedim ama sanırım beceremedim. :?

Kod: Tümünü seç

UPDATE MALZEMETEMP M
SET
M.girist=cast (M.mlz_girt as date)
WHERE NOT (M.MLZ_GIRT IS NULL)
malzemenin giriştarihini kaydederken integer olarak kaydetti. yukardaki sqli ibexpert te çalıştırınca
Overflow occurred during data type conversion.
conversion error from string "34982".
mesajını alıyorum.
Girist date tipinde
mlz_girt integer tipinde
girist yi timestamp yapıp denedim olmadı.

SQL ile olmazsa birazda delphiden kurcalıyacaz artık.
-------------
Not: Cast ve Date i birlikte arattırdım. Ama çıkan sonuçlardan bulamadım.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

tarih degerini integer alana nasıl kaydettiniz.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Delphiden

Kod: Tümünü seç

t1.fields[i].value:=t2.fields[i].value;
şeklinde aktardım.
Geri benzer bir şekilde variant ları kullanarak integeri tarihe aktardım ama sql ile olmadı.

Kod: Tümünü seç

v:=tablointegeralan.asinteger;
talbodatealan.asdatetime:=v;
ile delphiden geri tarihe çevirdim ama CAST ile olmadı. Bana CASTırdı. :D
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

bu tarz duzenlemelerde Delphi daha etkin, veritabanı tarfında kasmaya gerek yok bence
bi arkadasta double dan numeric e cevirmek icin tırmalamıstı, delphide iki satır kodla yapabiliyorsun.
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

evet bende öyle yaptım.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

Veri tabanı tarafında ,veri tabanını bir kez oluşturduktan sonra mesela bir tabloya ait öğelerin (metadata) alan tipi üzerinde değişiklik yapılamıyor. Yani ALTER komutunu alan tipi değiştirmek için kullanamıyorsunuz. Fakat index v.b. gibi şeyler değiştirilebiliyor.

Tam emin değilim ama, ilgili alanı veri tabanı tarafında silip tekrar oluşturabiliyoruz diye okumuştum.

saygılar..
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

alan ismi ve tipi degistirilebiliyor.
hele vt bos ise hic sorun cıkmaz
ÜŞENME,ERTELEME,VAZGEÇME
onaydin

Mesaj gönderen onaydin »

alan ismi ve tipi degistirilebiliyor.
Firebird 1.5.1 üzerinde dbworkbench ile çalışırken
alan veri tipini önce integer olarak kaydediyorum
ardından bunu varchar ile değiştirmek istediğimde

unsuccesful metadata update
Cannot change datatype for column AD from a character type
to a non character type diyor

table boş.
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ben domain kullanmanın avantajını gordugumden beri domain kullanıyorum
simdi Integer alana sahip bir tablo olusturdum
A isimli Integer alanı D_STRING10 diye olusturdugum domain ile guncelledim
IbExpert te hic sorun cıkmadan guncelleyebildim
hatta Table dolu olsa dahi Integerdan stringe donusum yapabiliyorsunuz.
ama tersinde sorun cıkıyor.

Kod: Tümünü seç

CREATE DOMAIN D_STRING10 AS
VARCHAR(10) CHARACTER SET WIN1254
COLLATE PXW_TURK
ÜŞENME,ERTELEME,VAZGEÇME
onaydin

Mesaj gönderen onaydin »

Abi aynen dediğin gibi oldu
Sorunsuz geçiş yapabiliyor, evvelinde boyle bir kaç alanı sil baştan
yazmıştım.
Teşekkürler
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

küçük bir ipucu, biri date diğeri time tipinde iki alanı timestamp a çevirmek için

Kod: Tümünü seç

SELECT jobdate,requesttime,CAST(jobdate || ' ' ||requesttime AS TIMESTAMP)AS req FROM jobarchive

Kod: Tümünü seç

JOBDATE         REQUESTTIME     REQ
20.06.2006      14:55:51        20.06.2006 14:55:51
20.06.2006      14:55:51        20.06.2006 14:55:51
<null>          14:55:51        <null>
20.06.2006      <null>          <null>
az önce lazım oldu, arşivdede bulunsun istedim;
.-.-.-.-.-.-.-. ^_^
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Sayenizde yine yeni şeyler öğrendik.

Ben bu CAST i pek fazla kullanmazdım. Meğer ne çok ince noktası varmış.

anladığım kadarıyla CAST önce alan değerini string e çeviriyor sonrada belirttiğiniz alana. Bu nedenlede date, timestamp gibi verileri sayısal bir değere çeviremiyorsunuz terside doğru.

peki bu integer bir alan date e çevrilemez mi? Sanırım bir yol buldum. @aslangeri nin SQL ifadesi şöyle olbilirdi.

Kod: Tümünü seç

UPDATE MALZEMETEMP M 
SET 
M.girist=cast( cast('4.7.2006' as date) - 732495 as date) + M.mlz_girt 
WHERE NOT (M.MLZ_GIRT IS NULL)
Yalnız burda bir durum daha var.

Windows Date tipi ile Firebird Date, Timestamp tiplerindeki yaklaşım farklı. Windows da Date 31.12.1889 gece yarısından başlayan ve her gün için 1 değer artan bir biçimde iken, Firebird te Data Julien takvimini mutlak 0 alan ve her gün için 1 değer artan bir biçimde.

Haliyle Delphi de Date i integer a dönüştürüp veritabanına yazınca Windows yaklaşımında bir integer değer elde edilir (tahminen). Bu durumda firebird te direk dönüşüm yaparken iki yaklaşım arasındaki gün sayısını yukardaki toplama eklemek gerekecektir. Ben deneyemedim bir arkadaşımız denerse sonucu yazabilir mi lütfen.

Kolay gelsin.
Cevapla