PostgreSQL "invalid input syntax for type timestamp" — Tarih Neden Okunamıyor?
Tarih formatı, DateStyle, boş string ve MySQL'in 0000-00-00 değeri kaynaklı timestamp hatalarının ayrımı ve güvenli dönüştürme yolları.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Üç farklı mesaj, üç farklı kök nedeni işaret eder:
ERROR: invalid input syntax for type timestamp: ""
ERROR: invalid input syntax for type timestamp: "31.12.2026"
ERROR: date/time field value out of range: "2026-02-30 10:00:00"- 1Boş String (`""`): Metinsel boşluk PostgreSQL tarafından tarih olarak kabul edilmez.
- 2Yerel Format (`"31.12.2026"`): Oturumun
DateStyleayarı ile gönderilen format uyuşmazlığı. - 3Takvim Dışı Tarih (`"2026-02-30"`): Şubat ayında 30. gün bulunmadığı için aralık dışı değer.
▸Nedeni Ayırt Eden Kontroller
SHOW DateStyle; -- Örnek çıktı: ISO, MDY
SHOW TimeZone;
SELECT '31.12.2026'::date; -- Bu oturumda hata verir mi?DateStyle = ISO, MDY iken '31.12.2026' hata fırlatır çünkü 31 bir ay olamaz. DMY iken çalışır. Bu ayar oturum (session) düzeyindedir ve uygulama bağlantı sürücüsüne göre değişebilir.
▸Adım Adım Çözüm
1. Boş String Değerlerini NULL'a Dönüştürün
INSERT INTO kayit (tarih) VALUES (NULLIF($1, '')::timestamp);2. MySQL'den Gelen 0000-00-00 Değerlerini Temizleyin
MySQL'den PostgreSQL'e veri taşırken en sık karşılaşılan tuzaktır:
SELECT NULLIF(NULLIF(tarih, ''), '0000-00-00 00:00:00')::timestamp FROM staging;3. Yerel Formatı Açıkça Belirterek Dönüştürün
Sunucunun DateStyle değişkenine güvenmek yerine formatı maskeyle belirtin:
SELECT to_timestamp('31.12.2026 14:30:00', 'DD.MM.YYYY HH24:MI:SS');
SELECT to_date('2026-12-31', 'YYYY-MM-DD');4. Toplu Dönüşüm Öncesi Hatalı Satırları Tarayın
SELECT id, tarih
FROM staging
WHERE tarih IS NOT NULL
AND tarih !~ '^\d{4}-\d{2}-\d{2}([ T]\d{2}:\d{2}(:\d{2})?)?$'
LIMIT 50;Bu regex ISO formatına uymayan satırları listeler; temizlik sonrasında ::timestamp cast işlemi güvenle çalışır.
▸Bunu Bir Daha Yaşamamak İçin
Uygulamalarınızda tarihleri her zaman ISO 8601 biçiminde (2026-12-31T10:00:00Z) gönderin. Veritabanı tasarımında timestamp yerine neredeyse her zaman `timestamptz` (zaman dilimli timestamp) tercih edin; aksi takdirde yaz saati geçişlerinde aynı yerel saatin iki kez yaşanması sonucu veri kronolojisi bozulur.
- •İlgili Hata: PostgreSQL duplicate key violates unique constraint
- •Veritabanı Hub: PostgreSQL Üretim Mimarisi Rehberi
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
PostgreSQL Bağlantı Tükenmesi ve too many clients Teşhisi
FATAL: sorry, too many clients already ve remaining connection slots hatalarının üç temel kök nedeni, yetki sınırlarıyla salt okunur pg_stat_activity teşhisi ve kalıcı iki katmanlı havuzlama çözümü.
PostgreSQL password authentication failed Hatası: Neden ve Çözüm
psql password authentication failed hatasının dört nedeni: yanlış şifre, md5/SCRAM uyuşmazlığı, pg_hba.conf sırası ve yanlış cluster. Adım adım teşhis.
PostgreSQL connection refused: 8 Adımda Kesin Teşhis
Connection refused, timeout ve "no pg_hba.conf entry" arasındaki fark; listen_addresses, port, firewall ve Docker port yayınlama kontrolleri.