Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:MMsaat 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.