![]() |
![]() |
![]() |
|
Помогите с запросом на 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) ага
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |