Merhaba Zafer Bey,

Tam olarak böyle olmasa da başka bir sistem ile SQL Server'ı entegre ederken bu sorunlarla karşılaşmıştım. SQL Server üzerindeki tablonun tarih formatını PostgreSQL'e aktarılırken değiştirdiğinizde, PostgreSQL'e gelen tarih standart bir formatta gelmiş oluyor ve bu formatı PostgreSQL algılayabiliyor. Aksi halde SQL Server henüz tespit edemediğim ama var olduğuna inanmak istediğin bir standarta uygun olarak tarih verisini gönderiyor size :)

Convert fonksiyonu içerisindeki varchar deyimi sadece verinin geliş şekline ait bir tanımlama. SQL Server'dan PostgreSQL'e veri aktarılırken varchar olarak belirlediğiniz tarih biçiminde aktarmasını zorlamak için var. PostgreSQL üzerinde tabloyu yaratırken sizin burada bu kolonu varchar olarak tanımlama gibi bir zorunluluğunuz yok. Örnek olarak aşağıdaki gibi yaratabilirsiniz PostgreSQL üzerinde bu tabloyu ve timestamp'in size kazandırdığı avantajlardan da feragat etmemiş olursunuz. Aynı zamanda gönderdiğiniz sorgularda da SQL Server üzerindeki index'i de halen kullanmaya devam edebilirsiniz. Tek dezavantajı SQL Server üzerinde biraz daha fazla işlemci kaynağı tüketmeniz olacak. Açıkçası 2M satırlık bir tablodan bahsediyorsak bu o kadar da büyük bir kayıp olmayacaktır diye düşünüyorum, yine de test edip görmek gerekiyor.

CREATE FOREIGN TABLE mssql_table (
    id integer,
    tarih timestamp,
    message varchar(50))
    SERVER mssql_svr
    OPTIONS (query 'SELECT id,CONVERT(varchar(25),tarih,121),message FROM dbo.test_tbl', row_estimate_method 'showplan_all');

Select * From mssql_table;

1;"2016-01-08 15:14:15.29";"satir 1"
2;"2016-01-08 15:14:20.43";"satir 2"
3;"2016-01-08 15:14:24.163";"satir 3"
4;"2016-01-08 15:14:26.93";"satir 4"
5;"";"satir 5"
6;"2016-01-08 15:14:42.303";"satir 6"
7;"2016-01-08 15:14:44.977";"satir 7"
8;"2016-01-08 15:18:21.253";"satir 8"
9;"2016-01-08 15:18:21.253";"satir 9"
10;"2016-01-08 15:18:21.253";"satir 9"

select * from mssql_table where tarih between '2016-01-08 15:14:20' and '2016-01-08 15:14:45';

2;"2016-01-08 15:14:20.43";"satir 2"
3;"2016-01-08 15:14:24.163";"satir 3"
4;"2016-01-08 15:14:26.93";"satir 4"
6;"2016-01-08 15:14:42.303";"satir 6"
7;"2016-01-08 15:14:44.977";"satir 7"

 

SQL Server tarafında çok fazla kolonunuz olduğu için query ile tabloyu bağlamaktan kaçındığınızı söylemiştiniz, şu şekilde yapabilirsiniz aslında bunu. Kolonları sorguya tek tek eklemezsiniz.

CREATE FOREIGN TABLE mssql_table (
    tarih timestamp,
    id integer,
    tarih_orig varchar(50),
    message varchar(50))
    SERVER mssql_svr
    OPTIONS (query 'SELECT CONVERT(varchar(25),tarih,121),* FROM dbo.test_tbl', row_estimate_method 'showplan_all');

*http://www.w3schools.com/sql/func_convert.asp


İyi çalışmalar.
Samed YILDIRIM


07.01.2016, 17:43, "Zafer Çelenk" <zafercelenk@gmail.com>:

 Merhaba Samed Bey,

 Yabancı (Foreign) tabloları oluştururken tablo tanımlaması ile yaptım.  Yaklaşık 130-140 alan içeren tablolar var bu sebeple query tanımlaması bana pek çekici gelmedi :)

 Ancak şöyle bir durum var. Tablo tanımı yaparken datetime alanları varchar olarak tanımlayınca sistem sorunsuz çalışıyor. Senin yaptığın gibi yanı ancak bu seferde tarih tipindeki alanları kaybetmiş oluyoruz. Yani tarih sorgularını nasıl yapacağız? Yani sonuçta bu alanları tarih formatında çalıştırmamız gerekiyor. Bunu nasıl çözeriz?

 Sanırm sende böyle bir işle uğraytın veya uğraşıyorsun, tarih alanlarını varchar'a çevirerek mi yapıyorsun, tarih sorgularında sorunlar olmuyor mu?

 Zafer.

 On Thu, Jan 7, 2016 at 5:14 PM, Samed YILDIRIM <samed@reddoc.net> wrote:

 Merhaba Zafer Bey, Postgresql'de tabloyu oluştururken table tanımlaması ile mi yaptınız yoksa query tanımlaması ile mi? Query tanımlaması kullandıysanız select sorgusunda ilgili kolonun olduğu bölümü aşağıdaki gibi değiştirebilirsiniz. SQL Server düzgün bir tarih format standartı kullanarak yapmadığı için bu işi benim de başımı çok ağrıttı. SELECT id,CONVERT(VARCHAR(25),tarih_kolonu,121) FROM sql_server_tablo İyi çalışmalar. İyi çalışmalar. Samed YILDIRIM 07.01.2016, 15:21, "Zafer Çelenk" <zafercelenk@gmail.com>:
 Merhaba, Evet, bu dış veri aracı gerçekten güzelmiş, kurdum ve bazı küçük denemeler yaptım. Gayet iyi görünüyor ancak gerçek sonucu 2 milyon satırlı tablolarımızı sorgulamaya başladığımızda göreceğiz ayrıca JOIN sorgularında bariz bir yavaşlık sözkonusu. Yinede gerçek zamanlı veri erişimi açısından sanırım en iyi çözüm. Ayrıca şöyle bir sorun var datetime alanlarını postresql üzerindeki tabloda "timestamp without time zone" tipinde tanımladım ancak hata veriyor ve aktarım yapmıyor. Sanırım sorun freetds üzerindeki çevrimden kaynaklanıyor. Hatalar aşağıda, bu konuda yardımcı olabilecek var mı? NOTICE:  DB-Library notice: Msg #: 5701, Msg state: 2, Msg: Changed database context to 'GOPLUS'., Server: IBMSERVER3650, Process: , Line: 1, Level: 0 NOTICE:  DB-Library notice: Msg #: 5703, Msg state: 1, Msg: Changed language setting to us_english., Server: IBMSERVER3650, Process: , Line: 1, Level: 0 NOTICE:  DB-Library notice: Msg #: 5701, Msg state: 2, Msg: Changed database context to 'GOPLUS'., Server: IBMSERVER3650, Process: , Line: 1, Level: 0 NOTICE:  DB-Library notice: Msg #: 5703, Msg state: 1, Msg: Changed language setting to us_english., Server: IBMSERVER3650, Process: , Line: 1, Level: 0 ERROR:  invalid input syntax for type timestamp: "Jan  2 2016 12:00:00:000AM" ********** Error ********** ERROR: invalid input syntax for type timestamp: "Jan  2 2016 12:00:00:000AM" SQL state: 22007 Zafer. On Thu, Jan 7, 2016 at 9:07 AM, Samed YILDIRIM <samed@reddoc.net> wrote:
 Merhabalar Zafer Bey, Foreign data wrappers saniyorum sizin ihtiyacinizi karsilayacaktir. https://github.com/GeoffMontee/tds_fdw İyi çalışmalar. 7 Oca 2016 ÖÖ 8:29 tarihinde Zafer Çelenk <zafercelenk@gmail.com> yazdı:
 Merhaba, MSSQL üzerinde sürekli artan verimi düzenli olarak PostgreSQL üzerine aktarmak istiyorum. Aslında aktarmadan ziyade DBLink benzeri bir çözümle gerçek zamanlı olarak MSSQL üzerindeki veriye ulaşabilirsem bu çok daha iyi olur. Ancak bir çözüm bulamadım. Bu konuda yardımcı olabilir misiniz?