2015-06-22 3 views
2

У меня есть бизнес в моей дате. Мне нужна дата изменения нижеУлучшение работы с SQL DataTime

за каждую дату до 25 каждого месяца я хочу получить 25 месяцев до и для каждой даты после 25 каждого месяца, я хочу получить 25 из того же месяца.

Пример:

для 2015/06/24 (или) 2015/06/06 мне нужно 2015/05/25

и 2015/06/25 (или 2015/06/30) Мне нужно 2015/06/25

Я пишу этот вопрос:

DECLARE @A DATE = '2015/06/01' 


SELECT 
    (CASE WHEN DATEDIFF(MONTH, DATEADD(Day, -25, @A), @A) = 0 
      THEN DATEADD(DAY, 25, DATEADD(Day, -DAY(@A), @A)) 
      ELSE DATEADD(DAY, 25, DATEADD(MONTH, -1, DATEADD(Day, -DAY(@A), @A))) 
     END) 

Но я ищу лучшее решение.

+1

Совет. Полезно отметить вопросы базы данных как с помощью соответствующего программного обеспечения (MySQL, Oracle, DB2, ...) и версии, например. 'SQL-сервер-2014'. Различия в синтаксисе и особенностях часто влияют на ответы (как отметил Амит). – HABO

ответ

4

Вы можете сделать это следующим образом:

SELECT IIF(DAY(@A) >= 25, 
      DATEADD(d, 25 - DAY(@A), @A), 
      DATEADD(d, 25, EOMONTH(@A, -2))) 

Вот пример скрипку, а также: sqlfiddle

Примечание: EOMONTH требует SQL Sever 2012 или выше - она ​​возвращает End-Of-Month даты с датой начала и смещением за месяц.

0

Вы должны быть в состоянии сделать это с одним DATEADD заявлением:

SELECT dateadd(dd, 25 - datepart(dd, @A), @A) 

DATEPART получает текущий день месяца (1, 6, 30, что угодно).

Мы вычтем это, а затем добавим 25, чтобы дать результат, который вы хотите, 25 числа месяца.

+1

Это не работает. – Amit