Ако трябва да извлечете номера на ISO седмицата от дата в SQL Server, можете да използвате iso_week
аргумент при извикване на DATEPART()
функция. Като алтернатива можете да използвате isowk
или isoww
аргументи, за да направите същото.
Под „седмица ISO“ имам предвид стандарта за дата и час ISO 8601.
ISO седмиците започват в понеделник и първата седмица на годината съдържа 4 януари на същата година. Следователно е възможно датите от началото на януари да са част от 52-ата или 53-та седмица на предходната година, а датите от края на декември да са част от първата седмица на следващата година.
Това означава, че когато извлечете номера на седмицата от дата, можете да получите различни резултати в зависимост от това дали използвате григорианския календар или стандарта за дата и час ISO 8601.
Пример
DECLARE @date date = '2021-01-01';
SELECT DATEPART(iso_week, @date);
Резултат:
53
В този случай датата е 1 януари 2021 г., но от гледна точка на ISO това е 53-та седмица на 2020 г.
Сравнение с григориански
Ето още един пример, за да го сравните с григорианската седмица.
DECLARE @date date = '2021-01-01';
SELECT
DATEPART(week, @date) AS week,
DATEPART(iso_week, @date) AS iso_week;
Резултат:
+--------+------------+ | week | iso_week | |--------+------------| | 1 | 53 | +--------+------------+
Така че можем да видим, че една и съща дата може да има различен номер на седмицата в зависимост от това дали използваме григорианския календар или стандарта ISO.
Можем да направим същото с дата близо до края на предходната година.
DECLARE @date date = '2020-12-27';
SELECT
DATEPART(week, @date) AS week,
DATEPART(iso_week, @date) AS iso_week;
Резултат:
+--------+------------+ | week | iso_week | |--------+------------| | 53 | 52 | +--------+------------+
Алтернативни аргументи
Както споменахме, алтернативно може да използва isowk
или isoww
за да върнете номера на седмицата по ISO.
DECLARE @date date = '2021-01-01';
SELECT
DATEPART(iso_week, @date) AS iso_week,
DATEPART(isowk, @date) AS isowk,
DATEPART(isoww, @date) AS isoww;
Резултат:
+------------+---------+---------+ | iso_week | isowk | isoww | |------------+---------+---------| | 53 | 53 | 53 | +------------+---------+---------+