Как извлечь «Номер недели» и «Номер дня» из даты, если начальный день равен «Понедельник» в месячном SQL - PullRequest
2 голосов
/ 19 мая 2019

Я извлекаю ниже из даты:

Номер недели Номер дня

Где день начала моей недели - понедельник.

Например, дата: «1 мая 2019» или «2019-05-01»

Тогда

Номер недели = 1 Номер дня = 3

Потому что сегодня среда 1 мая 2019 года.

Я использую MS SQL Server 2012. и использовал ниже код из сети, чтобы получить номер недели. Отсюда я получаю номер недели, но я не понимаю, что на самом деле он делает.

select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1

Может кто-нибудь объяснить мне это и сказать, как извлечь номер дня.

Ответы [ 5 ]

0 голосов
/ 20 мая 2019

Я построил запрос в соответствии с вашими потребностями.Работает нормально.

ПРИМЕЧАНИЕ : воскресенье считается 1-м днем ​​недели, а суббота считается 7-м днем ​​недели

DECLARE @dt datetime='2019-05-01'
DECLARE @Weekday INT

if(((DATEPART(DW, @dt) + @@DATEFIRST + 5) % 7 +2) =8)
    SET @Weekday =1 
else 
    SET @Weekday = ((DATEPART(DW, @dt) + @@DATEFIRST + 5) % 7 +2)

select DATEPART(week, @dt)- DATEPART(week, CONVERT(CHAR(6), @dt, 112)+'01')+ 1 AS [Week Number], @Weekday AS [Day of Week]
0 голосов
/ 19 мая 2019

Проверить это-

SELECT ISNULL(NULLIF(DATEPART(DW,GETDATE())-1,0),7)
0 голосов
/ 19 мая 2019

Если вы установите datefirst, вы можете просто сделать:

set datefirst 1;  -- "1" = "Monday"

select datepart(week, getdate()), datepart(weekday, getdate())
0 голосов
/ 19 мая 2019

Другие упоминали, как узнать день недели.

С точки зрения вашего кода для получения недели месяца:

select datediff(week, dateadd(week, datediff(week, 0, dateadd(month, datediff(month, 0, @date), 0)), 0), @date - 1) + 1

На мой взгляд, число полных месяцев, прошедших между нулевым днем ​​и текущей датой, дает нам серийный номер месяца.

Затем к этому значению добавляется ноль месяцев (которые, очевидно, используются для приведения серийного месяца обратно к дате, представляющей начало текущего месяца), давая нам дату начала месяца.

Затем он получает количество полных недель, прошедших между нулевым днем ​​и датой начала месяца, давая нам недельный сериал.

Серийный номер недели затем возвращается к дате начала недели, представляющей понедельник до или до даты начала месяца.

Затем он получает разницу в неделях между датой в понедельник или ранее и днем, предшествующим текущей дате, и добавляет 1 (чтобы первая неделя месяца была представлена ​​как неделя 1).

Звучит как правдоподобный алгоритм, но я бы не одобрил его, не проверив и не проверив промежуточные значения, или если вы не нашли его из авторитетного источника.

0 голосов
/ 19 мая 2019

Этот выбор даст вам @date день недели (1: понедельник, 7: воскресенье) независимо от вашего @@ DATEFIRST набора MS Doc :

select (DATEPART(DW, @date) + @@DATEFIRST + 5) % 7 + 1 as [Day of Week]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...