dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Home/Hata Teşhis Kütüphanesi/postgresql-invalid-input-syntax-timestamp
PostgreSQL
PostgreSQL 14–18Veri Tipleri & Dönüşüm
6 dk okuma
ERROR: invalid input syntax for type timestamp

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ı.

İnceleyen:Senior Database Reliability Engineer
Test Edilen Sürümler: PostgreSQL 18.6 & 17.11 (Alpine Linux / Docker 29.7) | Tarihsel: PostgreSQL 14, 15, 16

Operasyonel Doğrulama & Güvenilirlik Standardı

Son Teknik İnceleme: 29 Ekim 2026
Test Edilen SürümlerPostgreSQL 18.6 & 17.11 | Tarihsel: PostgreSQL 14.10, 15.6, 16.4
Gerekli YetkiHedef tabloda SELECT / UPDATE yetkisi
Risk Seviyesi
LowToplu cast işlemlerinde tek bir hatalı satır tüm transaction'ı iptal eder
Beklenen ÇıktıISO 8601 uyumlu dönüşüm ve to_timestamp() ile hatasız veri aktarımı
Geri Dönüş (Rollback) Planı:Staging tablosundaki geçici kolonları temizleyip kaynak formatı koruma
PostgreSQL Docs: Date/Time Types & DateStyle
İlk 60 Saniye Teşhis Protokolü:

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:

plaintext
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"
  1. 1Boş String (`""`): Metinsel boşluk PostgreSQL tarafından tarih olarak kabul edilmez.
  2. 2Yerel Format (`"31.12.2026"`): Oturumun DateStyle ayarı ile gönderilen format uyuşmazlığı.
  3. 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

sql
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

sql
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:

sql
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:

sql
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

sql
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.

Diğer Veritabanı Hata Teşhisleri

Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.

Tüm Hatalar (50)