Проблема при использовании DATEADD и DATEDIFF для получения начального дня (понедельника) недели - PullRequest
3 голосов
/ 31 августа 2011

Я использую этот sql, чтобы получить день начала недели (понедельник), когда пользователи вводят дату других дней

@ StartDate имеет формат (ггггммдд)

SQL: CAST(convert(varchar(12),DATEADD(week,DATEDIFF(week,0,@StartDate),0),112) as int

Проблема в том, что при вводе даты со вторника по субботу он возвращается к правильному понедельнику текущей недели. Тем не менее, когда введенная дата - воскресенье, она возвращает дату понедельника на следующей неделе.

Может кто-нибудь сказать мне, что я сделал не так
спасибо

Ответы [ 3 ]

4 голосов
/ 31 августа 2011

Ваше воскресенье относится к той же неделе, что и понедельник, поэтому понедельник станет первым днем ​​недели. Это должно исправить ваш запрос

set datefirst 1

Этот синтаксис не имеет значения, в какой день база данных рассматривает первый день недели, он будет вычислять понедельник реальной недели вашей @ StartDate.

DATEADD(week, DATEDIFF(day, 0, @StartDate)/7, 0)

Вы можете проверить это:

SELECT DATEADD(week, DATEDIFF(day, 0, getdate())/7, 0)
1 голос
/ 31 августа 2011

Вы знаете, как я это делаю?

SELECT max(cal_date)
FROM calendar
WHERE cal_date <= CURRENT_DATE
  AND day_of_week = 'Mon'

Нет арифметики.Быстро, работает за 0,000082 секунды на моей старой коробке.Таблица календаря индексируется;он может эффективно использоваться в соединениях на больших таблицах.

И самое главное - вы можете сказать, что запрос, очевидно, правильный.

1 голос
/ 31 августа 2011

Это работает:

SELECT DATEPART(weekday, DATEADD(day, -1, CONVERT(DATETIME, @StartDate)))

Кроме того, не забудьте сначала установить правильный формат даты:

SET DATEFORMAT ymd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...