Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt uitgelegd hoe tijdzonebewuste datum/tijd-velden werken met SQL Server via de mssql-django back-end en hoe u bestaande gegevens migreert wanneer u ondersteuning voor tijdzones inschakelt.
Hoe ondersteuning voor tijdzones werkt
De instelling van USE_TZ Django in settings.py bepaalt of datum/tijd-velden tijdzonebewust zijn:
| Instelling | Kolomtype | Gedrag |
|---|---|---|
USE_TZ=False |
datetime2 | Slaat naïeve datum/tijd op zonder tijdzone-informatie. |
USE_TZ=True |
datetimeoffset | Slaat tijdzonebewuste datum/tijd op met UTC-offset. |
Note
Django is standaard ingesteld op USE_TZ=False in alle versies, waaronder Django 5.x en 6.0. Als uw project ondersteuning voor tijdzones nodig heeft, moet u expliciet instellen USE_TZ=True in uw settings.py. Zie ondersteuning voor tijdzones in Django voor meer informatie. Houd er rekening mee dat datetimeoffset doorgaans meer opslag gebruikt dan datetime2 voor dezelfde tijdstempelprecisie, dus voor grote tabellen moet u opslag- en queryplannen valideren na de migratie.
Ondersteuning voor tijdzone inschakelen
Stel USE_TZ=True in uw settings.py in:
USE_TZ=True
TIME_ZONE = "UTC"
Wanneer USE_TZ deze optie is ingeschakeld, slaat Django alle datum/tijd in UTC op en converteert deze naar de lokale tijdzone voor weergave.
mssql-django Vanaf 1.7.2 stemt de back-end ook het gedrag van Django Now() af op tijdzonebewuste SQL-generatie wanneer USE_TZ=True.
Bestaande datum/tijd-kolommen migreren
Als uw Django-app vóór het inschakelen van USE_TZ=True kolommen DateTimeField had, moet u datetime2-kolommen handmatig migreren naar datetimeoffset en de lokale tijd naar UTC converteren.
De mssql-django backend gebruikt datetime2 als onderliggend kolomtype voor DateTimeField wanneer USE_TZ=False. Als u inschakelt USE_TZ , worden bestaande kolommen niet automatisch geconverteerd.
Vervang in de volgende stappen de tijdelijke aanduidingen:
-
<table-name>: de tabelnaam die de kolom bevat. -
<datetime-column>: de kolomnaam die moet worden geconverteerd. -
<offset>: De tijdzone-offset van uw bestaande gegevens als een tekenreeks in{+|-}HH:MMnotatie (bijvoorbeeld'-05:00'voor US Eastern).
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2025 of AdventureWorksDW2025 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
Stap 1: Kolomtypen wijzigen
Voer de volgende SQL uit op elke tabel met datum/tijd2-kolommen . SQL Server de waarde impliciet converteert en een +00:00 offset toewijst:
ALTER TABLE <table-name>
ALTER COLUMN <datetime-column> DATETIMEOFFSET;
Stap 2: Converteren naar UTC
Nadat de kolom datetimeoffset is, tagt u elke waarde opnieuw met de oorspronkelijke offset van de lokale tijdzone en converteert u naar UTC:
UPDATE <table-name>
SET <datetime-column> = TODATETIMEOFFSET(<datetime-column>, <offset>) AT TIME ZONE 'UTC';
TODATETIMEOFFSET vervangt het offsetgedeelte van de datum/tijdoffset-waarde , zodat het tijdstempel de oorspronkelijke lokale tijd weerspiegelt.
AT TIME ZONE 'UTC' converteert vervolgens het resultaat naar UTC.
Important
Eén vaste offset werkt alleen wanneer alle bronwaarden dezelfde offset delen. Als uw gegevens zomertijdovergangen omvatten, moet u de offset afleiden op datum of een conversiestrategie op basis van een tijdzonenaam gebruiken in plaats van één constante verschuiving toe te passen op elke rij.
SQL Server tijdzonenamen
Gebruik Windows tijdzonenamen bij het converteren met AT TIME ZONE. Veelvoorkomende voorbeelden:
| Regio | SQL Server tijdzonenaam | DST-overgangsdatums (2026) |
|---|---|---|
| Oostelijke VS | Eastern Standard Time |
8 maart – 1 november |
| US Centraal | Central Standard Time |
8 maart – 1 november |
| US Pacific | Pacific Standard Time |
8 maart – 1 november |
| UTC | UTC |
Geen (geen DST) |
| Europa/Londen | GMT Standard Time |
29 maart – 25 oktober |
Voer een query uit voor een volledige lijst SQL Server:
SELECT name, current_utc_offset, is_currently_dst
FROM sys.time_zone_info
ORDER BY name;
Zie sys.time_zone_info voor volledige documentatie.
Voorbeeld: Amerikaanse Eastern Time omzetten naar UTC (rekening houdend met zomertijd)
In dit voorbeeld wordt een bestaande AdventureWorks2025 schematabel gebruikt en wordt de juiste DST-verwerking tijdens de migratie gedemonstreert:
-- 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
Test altijd tijdzoneconversies met gegevens die DST-overgangsdatums omvatten. In de vorige query wordt 8 maart getest (het ingaan van de zomertijd), het moment waarop Eastern Time overgaat van EST (UTC-5) naar EDT (UTC-4).
Als u uw toepassingstabellen wilt migreren, past u hetzelfde AT TIME ZONE conversiepatroon toe op uw eigen DateTimeField kolommen. Voeg voor elke tabel een datetimeoffset-kolom toe en vul deze in vanuit de bestaande kolom:
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';
Nadat u de conversieresultaten hebt gecontroleerd, zet u de oude kolom neer en wijzigt u de naam van de nieuwe kolom:
ALTER TABLE [your_schema].[your_table]
DROP COLUMN [old_date_column];
EXECUTE sp_rename '[your_schema].[your_table].[date_column_datetimeoffset]', 'date_column', 'COLUMN';
Gebruik de SQL Server Windows tijdzonenaam die overeenkomt met uw brongegevensregio. Zie sys.time_zone_info voor meer informatie.
Stap 3: De Django-migratie voltooien
Nadat u de databasekolommen hebt geconverteerd, volgt u de documentatie van Django over het migreren van een project dat is gestart voordat ondersteuning voor tijdzones werd toegevoegd.
Important
Voer deze migratie uit op alle DateTimeField kolommen in alle tabellen. Als een kolom ontbreekt, leidt dit tot een incorrecte verwerking van de tijdzone voor deze velden.
Limitations
- Tijdzones en timedeltas: Niet alle bewerkingen met tijdzones en timedeltas worden volledig ondersteund. Zie Beperkingen en niet-ondersteunde functies in mssql-django voor meer informatie.
- Rekenkundige bewerkingen met datum/tijd: Rechtshandige macht en rekenkundige bewerkingen met datum/tijd-waarden werken mogelijk niet zoals verwacht wanneer ondersteuning voor tijdzones is ingeschakeld.