Имя: Пароль:
IT
 
Помогите с запросом на SQL
0 1Сергей
 
12.04.13
14:10
Бошка уже совсем не варит. Помогите, люди добрые, кто чем может
Есть две переменные @StartDate и @EndDate. Надо получить 4 переменные.
1. Дата начала месяца @StartDate
2. Дата конца месяца @EndDate
3. Дата начала месяца @StartDate минус количество месяцев в периоде между 1. и 2.
4. Дата конца месяца @EndDate минус количество месяцев в периоде между 1. и 2.

Так для дат 01.01.13 и 31.03.13 результаты должны быть:
1. 01.01.13
2. 31.03.13
3. 01.10.12
4. 31.12.12

пока вот чего накропал, но не работает как надо
   SELECT
       (DATEDIFF(MONTH, @StartDate, @EndDate) + 1) AS MonthCount,
       DATEADD(DAY, 1 - DAY(DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, @StartDate)), DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, @StartDate)) AS StartDate0,
       DATEADD(DAY, - DAY(DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, @EndDate)), DATEADD(MONTH, 1, DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, @EndDate))) AS EndDate0,
       DATEADD(DAY, 1 - DAY(@StartDate), @StartDate) AS StartDate1,
       DATEADD(DAY, - DAY(@EndDate), DATEADD(MONTH, 1, @EndDate)) AS EndDate1
1 1Сергей
 
12.04.13
14:14
DATEFROMPARTS не предлагать, в 2008 оно не работает
2 Ёпрст
 
гуру
12.04.13
14:18
(0)

select
dateadd(day,datediff(day,'20130101',@StartDate),'20130101') as StartDate0,
dateadd(day,datediff(day,'20130131',@EndDate),'20130131') as EndDate0,
3 Ёпрст
 
гуру
12.04.13
14:19
ну а остальное сам ..
4 1Сергей
 
12.04.13
14:23
(2) вместо '20130101' вставлять то, как я считаю StartDate1 ?
5 Ёпрст
 
гуру
12.04.13
14:27
блин, так надо - тебе же начало и конец месяца надо..

select
dateadd(month,datediff(month,'20130101',@StartDate),'20130101') as StartDate0,
dateadd(month,datediff(month,'20130131',@EndDate),'20130131') as EndDate0
6 1Сергей
 
12.04.13
14:28
В общем, пока так работает:
SELECT
       (DATEDIFF(MONTH, @StartDate, @EndDate) + 1) AS MonthCount,
       DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, DATEADD(DAY, 1 - DAY(@StartDate), @StartDate)) AS StartDate0,
       DATEADD(DAY, - DAY(@StartDate), @StartDate) AS EndDate0,
       DATEADD(DAY, 1 - DAY(@StartDate), @StartDate) AS StartDate1,
       DATEADD(DAY, - DAY(DATEADD(MONTH, 1, @EndDate)), DATEADD(MONTH, 1, @EndDate)) AS EndDate1
7 Ёпрст
 
гуру
12.04.13
14:28
ну и остальное добавишь сам
8 Sammo
 
12.04.13
14:28
9 1Сергей
 
12.04.13
14:29
(5) могут выбрать же не только 13-ый год
10 Ёпрст
 
гуру
12.04.13
14:30
(9) не вопрос, воткни туда 17530101 и 17530131 ...
11 1Сергей
 
12.04.13
14:31
(10) если выберут, например 3-ий квартал, взлетит? т.е. в результате должны быть периоды 2 и 3-ий кварталы
12 1Сергей
 
12.04.13
14:32
(8) не самые красивые решения, хочу сказать. Приводить дату в строку, потом опять в дату. Про локализацию, видимо, автор не слышал
13 Ёпрст
 
гуру
12.04.13
14:34
(11) да
14 Ёпрст
 
гуру
12.04.13
14:35
это просто получение даты начала и конца месяца, если заменить на year - получишь для даты дату начала и конца года, для дня - получишь начало и конец дня (полночь и 23 59...
15 Ёпрст
 
гуру
12.04.13
14:36
ну и с квартало тоже должно прокатить.
можно проверить
16 Ёпрст
 
гуру
12.04.13
14:37
и с неделей.. нужно только в граничных датах указывать начало и конец нужного периода.
17 1Сергей
 
12.04.13
14:40
(13) твой запрос считает только текущий период. У меня проблема с прошлым как раз
18 Ёпрст
 
гуру
12.04.13
14:43
(17) ? в плане текущий ? Он возвращает дату начала месяца в любом периоде, (ну и дату конца месяца тоже)


select
dateadd(month,datediff(month,'17530101',@StartDate),'17530101') as НачалоСесяца,
dateadd(month,datediff(month,'17530131',@EndDate),'17530131') as КонецМесяца
19 1Сергей
 
12.04.13
14:46
(18) мне нужно 4 даты. Начало и конец текущего периода, начало и конец прошлого периода. Тут, прошлый период - это такое же количество полных месяцев, как и в текущем периоде, но те месяцы, которые идут перед текущими
20 Ёпрст
 
гуру
12.04.13
14:49
(19)  И ?
Я тебе дал пример получения начала и конца месяца для произвольной даты
21 Ёпрст
 
гуру
12.04.13
14:49
подставляй свои и вперёд
22 Ёпрст
 
гуру
12.04.13
14:51
выполни в QA:


Declare @StartDate datetime
set @StartDate='20130812'
select
dateadd(month,datediff(month,'17530101',@StartDate),'17530101') as НачалоМесяца,
dateadd(month,datediff(month,'17530131',@StartDate),'17530131') as КонецМесяца,
dateadd(year,datediff(year,'17530101',@StartDate),'17530101') as НачалоГода,
dateadd(year,datediff(year,'17531231',@StartDate),'17531231') as КонецГода
23 1Сергей
 
12.04.13
14:57
(20) в общем, вот так доработал твой запрос:

select
dateadd(month,datediff(month,'20130101',DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, @StartDate)),'20130101') as StartDate0,
dateadd(month,datediff(month,'20130131',DATEADD(MONTH, - DATEDIFF(MONTH, @StartDate, @EndDate) - 1, @EndDate)),'20130131') as EndDate0,
dateadd(month,datediff(month,'20130101',@StartDate),'20130101') as StartDate1,
dateadd(month,datediff(month,'20130131',@EndDate),'20130131') as EndDate1
24 1Сергей
 
12.04.13
14:59
(23) + но он, собака, начало прошлого периода считает 2014 год :)
25 1Сергей
 
12.04.13
15:00
(24) + а, не. Всё норм. Я переменные неправильно задал
26 Ёпрст
 
гуру
12.04.13
15:00
ну и ладно
27 1Сергей
 
12.04.13
15:06
Вот так оптимальнее будет:
SELECT
(DATEDIFF(MONTH, @StartDate, @EndDate) + 1) AS MonthCount,
DATEADD(MONTH, DATEDIFF(MONTH,'17530101', @StartDate)- DATEDIFF(MONTH, @StartDate, @EndDate) - 1, '17530101') as StartDate0,
DATEADD(MONTH, DATEDIFF(MONTH,'17530131', @EndDate)- DATEDIFF(MONTH, @StartDate, @EndDate) - 1, '17530131') as EndDate0,
DATEADD(MONTH, DATEDIFF(MONTH,'17530101', @StartDate), '17530101') as StartDate1,
DATEADD(MONTH, DATEDIFF(MONTH,'17530131', @EndDate), '17530131') as EndDate1

Спасибо, Ёпрст !
28 Ёпрст
 
гуру
12.04.13
15:16
(27) на самом деле, 1753 не обязательно указывать - с любым годом будет работать, хоть с 2020
29 Ёпрст
 
гуру
12.04.13
15:16
главное - граница даты (начало и конец месяца/года)
30 1Сергей
 
12.04.13
15:16
(28) да, я заметил. Можно ведь добавлять и отрицательное количество месяцев
31 Ёпрст
 
гуру
12.04.13
15:17
(30) ага
Ошибка? Это не ошибка, это системная функция.