mssql-django'da saat dilimi desteği

Bu makalede, saat dilimi kullanan tarih saat alanlarının arka uç üzerinden mssql-django SQL Server ile nasıl çalıştığı ve saat dilimi desteğini etkinleştirdiğinizde mevcut verilerin nasıl geçirileceği açıklanmaktadır.

Saat dilimi desteği nasıl çalışır?

Django'nun USE_TZ içindeki settings.py ayarı, tarih saat alanlarının saat dilimine duyarlı olup olmadığını denetler:

Setting Sütun türü Behavior
USE_TZ=False datetime2 Saat dilimi bilgisi içermeyen tarih-saat değerlerini depolar.
USE_TZ=True datetimeoffset UTC uzaklığıyla birlikte saat dilimi bilgisi içeren tarih ve saat değerlerini depolar.

Note

Django varsayılan olarak Django 5.x ve 6.0 dahil olmak üzere tüm sürümlerde USE_TZ=False olarak ayarlı olur. Projenizin saat dilimi desteğine ihtiyacı varsa, settings.py içinde USE_TZ=True değerini açıkça belirtmeniz gerekir. Daha fazla bilgi için bkz. Django'da saat dilimi desteği . Datetimeoffset'in aynı zaman damgası duyarlığı için genellikle datetime2'den daha fazla depolama alanı kullandığını, bu nedenle büyük tablolarda geçişten sonra depolama ve sorgu planlarını doğrulamanız gerektiğini unutmayın.

Saat dilimi desteğini etkinleştirme

settings.py içinde USE_TZ=True ayarlayın:

USE_TZ=True
TIME_ZONE = "UTC"

Etkinleştirildiğinde USE_TZ Django tüm tarih saatlerini UTC olarak depolar ve bunları görüntülenmek üzere yerel saat dilimine dönüştürür.

mssql-django 1.7.2’den itibaren, arka uç da Django Now() davranışını, USE_TZ=True olduğunda zaman dilimine duyarlı SQL oluşturmayla uyumlu hâle getirir.

Mevcut tarih/saat sütunlarını taşıma

Django uygulamanızın DateTimeField etkinleştirmeden USE_TZ=Trueönce sütunları varsa , datetime2 sütunlarını el ile datetimeoffset'e geçirmeniz ve yerel saati UTC'ye dönüştürmeniz gerekir.

mssql-django arka uç, USE_TZ=False olduğunda DateTimeField için temel sütun türü olarak datetime2 kullanır. USE_TZ Etkinleştirme, mevcut sütunları otomatik olarak dönüştürmez.

Aşağıdaki adımlarda yer tutucuları değiştirin:

  • <table-name>: Söz konusu sütunun bulunduğu tablo adı.
  • <datetime-column>: Dönüştürülecek sütun adı.
  • <offset>: Var olan verilerinizin bir dize biçimindeki {+|-}HH:MM saat dilimi uzaklığı (örneğin, '-05:00' ABD Doğu).

Bu makaledeki kod örneklerinde AdventureWorks2025 veya AdventureWorksDW2025 örnek veritabanı kullanılır; bunları Microsoft SQL Server Samples and Community Projects ana sayfasından indirebilirsiniz.

1. Adım: Sütun türlerini değiştirme

datetime2 sütunları olan her tabloda aşağıdaki SQL'i çalıştırın. SQL Server örtük olarak değeri dönüştürür ve bir +00:00 uzaklık atar:

ALTER TABLE <table-name>
ALTER COLUMN <datetime-column> DATETIMEOFFSET;

2. Adım: UTC'ye Dönüştürme

Sütun datetimeoffset olduktan sonra, her değeri özgün yerel saat dilimi uzaklığıyla yeniden etiketleyin ve UTC'ye dönüştürün:

UPDATE <table-name>
SET <datetime-column> = TODATETIMEOFFSET(<datetime-column>, <offset>) AT TIME ZONE 'UTC';

TODATETIMEOFFSET , datetimeoffset değerinin ofset kısmını değiştirerek zaman damgasının özgün yerel saati yansıtmasını sağlar. AT TIME ZONE 'UTC' ardından sonucu UTC'ye dönüştürür.

Important

Tek bir sabit uzaklık yalnızca tüm kaynak değerleri aynı uzaklığı paylaştığında çalışır. Verileriniz yaz saati uygulaması geçişlerini kapsıyorsa, farkı tarihe göre hesaplayın veya her satıra tek bir sabit fark uygulamak yerine saat dilimi adına dayalı bir dönüştürme stratejisi kullanın.

SQL Server saat dilimi adları

ile AT TIME ZONEdönüştürürken Windows saat dilimi adlarını kullanın. Yaygın örnekler:

Region SQL Server saat dilimi adı DST geçiş tarihleri (2026)
ABD Doğu Saati Eastern Standard Time 8 Mart – 1 Kasım
ABD Orta Central Standard Time 8 Mart – 1 Kasım
ABD Pasifik Pacific Standard Time 8 Mart – 1 Kasım
UTC UTC Hiçbiri (DST yok)
Avrupa/Londra GMT Standard Time 29 Mart – 25 Ekim

Tam liste için SQL Server’ı sorgulayın:

SELECT name, current_utc_offset, is_currently_dst
FROM sys.time_zone_info
ORDER BY name;

Tüm belgeler için bkz. sys.time_zone_info .

Örnek: ABD Doğu saatini UTC'ye dönüştürme (DST kullanan)

Bu örnekte mevcut AdventureWorks2025 bir şema tablosu kullanılır ve geçiş sırasında doğru DST işlemesi gösterilir:

-- Test with a DST transition date (March 8, 2026)
SELECT TOP 10 SalesOrderID,
             CAST (OrderDate AS DATETIME2) AS OriginalDateTime2,
             (CAST (OrderDate AS DATETIME2) AT TIME ZONE 'Eastern Standard Time') AS EasternTime,
             (CAST (OrderDate AS DATETIME2) AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'UTC') AS ConvertedToUtc
FROM Sales.SalesOrderHeader
WHERE MONTH(OrderDate) = 3 AND DAY(OrderDate) = 8
ORDER BY SalesOrderID;

Tip

Saat dilimi dönüştürmelerini her zaman DST geçiş tarihlerine yayılan verilerle test edin. Önceki sorgu, Doğu Saatinin EST’ten (UTC-5) EDT’ye (UTC-4) geçtiği 8 Mart’ı (yaz saatine geçiş) test ediyor.

Uygulama tablolarınızı geçirmek için kendi AT TIME ZONE sütunlarınıza aynı DateTimeField dönüştürme desenini uygulayın. Her tablo için bir datetimeoffset sütunu ekleyin ve mevcut sütundan doldurun:

ALTER TABLE [your_schema].[your_table] 
ADD [date_column_datetimeoffset] datetimeoffset NULL;

UPDATE [your_schema].[your_table]
SET [date_column_datetimeoffset] = CAST([old_date_column] AS DATETIME2) AT TIME ZONE 'Eastern Standard Time' AT TIME ZONE 'UTC';

Dönüştürme sonuçlarını doğruladıktan sonra eski sütunu bırakın ve yeni sütunu yeniden adlandırın:

ALTER TABLE [your_schema].[your_table]
DROP COLUMN [old_date_column];

EXECUTE sp_rename '[your_schema].[your_table].[date_column_datetimeoffset]', 'date_column', 'COLUMN';

Kaynak veri bölgenizle eşleşen SQL Server Windows saat dilimi adını kullanın. Daha fazla bilgi için bkz. sys.time_zone_info.

3. Adım: Django geçişini tamamlama

Veritabanı sütunlarını dönüştürdükten sonra, Django'nun saat dilimi desteği eklenmeden önce başlatılmış bir projeyi taşıma konusundaki belgelerindeki yönergeleri izleyin.

Important

Bu geçişi tüm tablolardaki tüm DateTimeField sütunlarda çalıştırın. Herhangi bir sütunun eksik olmaması, bu alanlar için yanlış saat dilimi işlemeye neden olur.

Limitations

  • Saat dilimleri ve zaman farkları: Saat dilimlerini ve zaman farklarını içeren tüm işlemler tam olarak desteklenmeyebilir. Daha fazla bilgi için bkz. mssql-django'da sınırlamalar ve desteklenmeyen özellikler.
  • Tarih saatleriyle aritmetik: Saat dilimi desteği etkinleştirildiğinde sağ güç ve tarih saat değerleriyle aritmetik beklendiği gibi çalışmayabilir.