2015-04-22 5 views
1

У меня есть дата. Я должен определить дату понедельника в неделю, на которой моя дата лежит.Как найти начальную дату недели

+5

'SQL-server' или' mysql' ? Отметьте свой вопрос правильно. –

+2

Я полагаю, что также будет иметь значение, как вы классифицируете, какой день принадлежит той неделе - то есть, в какой день начинается ваша неделя? –

+0

Моя неделя начинается с понедельника –

ответ

2
SET DATEFIRST 1 
    SELECT DATEADD(DAY,1-DATEPART(WEEKDAY,'2012-01-01'),'2012-01-01') 
+1

Спасибо за ответ –

+0

** Браво !! ** Короткий и региональный независимый! –

1

Это зависит от @@DATEFIRST. Чтобы получить начало недели в вашем случае является понедельник:

SET DATEFIRST 1 
DECLARE @ThisDate DATE = GETDATE() 
SELECT DATEADD(DAY, 1 - DATEPART(WEEKDAY, @ThisDate), @ThisDate) 
+0

Моя неделя начинается с понедельника –

+0

Yup. Что-то не так с моим ответом? –

+0

Когда мы пробуем с воскресеньем, это создаст проблему. Я должен получить понедельник до этого. попробуйте этот select dateadd (wk, lateiff (wk, 0, '2012-01-01'), 0). –

2

MSSQL

SELECT CONVERT(varchar,DATEADD(day, DATEDIFF(day, 0, GETDATE()) /7*7, 0),100) AS weekstart 

MySql

SELECT DATE_ADD(date, INTERVAL(1-DAYOFWEEK(date)) +1 DAY) AS weekStart 
+0

MSSQL один довольно непрозрачный. Если я увидел это в производственном коде, я бы переписал его, чтобы быть немного более очевидным. –

+0

Во-вторых, мнение @BenThul –

+1

@BenThul, тем не менее, это лучшее решение. Однако преобразование его в варчар - огромная ошибка. Дата больше не является датой. Это единственный ответ, который не зависит от DATEFIRST. –

1

Учитывает разницу между эпохой (день 0) и датой.

Разделите это число на 7 и округлить (автоматическое округление при работе с целыми числами), это будет количество недель, чтобы добавить в день 0

SELECT dateadd(week, datediff(d, 0, getdate())/7, 0) 
+0

@ Giosco была ошибка в моих расчетах. Он был исправлен. Сейчас неделя начинается в понедельник вместо воскресенья. Это не будет зависеть от DATEFIRST, который, по моему мнению, является большой ошибкой. Если у вас есть это в функции, вы будете вынуждены устанавливать DATEFIRST каждый раз, когда вы вызываете функцию. –

+0

@SQLPolice моя неделя начинается в понедельник. Просто прошел мой первоначальный ответ и понял, что ошибок не было. –

+1

Да, теперь это правильное решение. «0» (2-й операнд в «датиффе») означает 1 января 1900 года - и по происшествию ** 20-й век начался в понедельник. ** (что было круто;)) Итак, вы в основном рассчитываете количество полных недель с 1900-01-01, и вы добавляете эти недели в понедельник, 1 января 1900 года. Таким образом, вы получаете последний понедельник. –

Смежные вопросы