powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ломаю голову 3ий день
20 сообщений из 20, страница 1 из 1
ломаю голову 3ий день
    #39678887
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно отобрать данные с промежутком дат -1 неделя от этих дат но чтобы они не совпадали т.е.

Date between DATEADD (week, -1, Begin) and DATEADD (week, -1, End)

получаем что эти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24

Как написать это условие?

BEGIN END
2018-01-01 2018-01-07
2017-12-25 2017-12-31
2017-12-18 2017-12-24
2017-04-10 2017-04-16
2017-03-06 2017-03-12
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39678936
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frameworkэти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24чёта не очень они совпадают... попробуйте объяснить задачу как-то по-иному, ни хрена ж не понять.
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39678941
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaframeworkэти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24чёта не очень они совпадают... попробуйте объяснить задачу как-то по-иному, ни хрена ж не понять.

Ну, у страдальца дата попадает в ДВА интервала.
Вот он и не могет решить: "какой взять?"

Тут, без волюнтаризма, никуда.
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39678942
982183
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное "не пересекались"
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679011
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Datex between DATEADD (week, -1, PromotionGoodsTimeBegin) and DATEADD (week, -1, PromotionGoodsTimeEnd)

Это условие возвращает следующие даты:

2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
2017-12-11 _____ 2017-12-17
2017-04-03 _____ 2017-04-09
2017-02-28 _____ 2017-03-04

Т.е. первые строки совпадают с датами из табл.(см. скрин)
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24

А надо чтобы вместо этих дат были ближайшие прошлые даты, а именно:
2017-12-04 ______ 2017-12-10
2017-11-29 ______ 2017-12-03
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679021
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как написать запрос, который бы сравнивал данные за последний период таким образом, чтобы эти даты не пересекались из табл(см. скрин) и период был одинаковый?

Например этим условием я сравниваю данные за прошлую неделю, и даты пересекаются с таблицей(см. скрин):

Datex between DATEADD (week, -1, PromotionGoodsTimeBegin) and DATEADD (week, -1, PromotionGoodsTimeEnd)

Это условие возвращает следующие даты:

2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
2017-12-11 _____ 2017-12-17
2017-04-03 _____ 2017-04-09
2017-02-28 _____ 2017-03-04

Т.е. первые строки совпадают с датами из табл.(см. скрин)
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24

А надо чтобы вместо этих дат были ближайшие прошлые даты, а именно:
2017-12-04 ______ 2017-12-10
2017-11-29 ______ 2017-12-03
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679022
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно, узнаю, вы профессиональные писцы тех. заданий
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679027
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
framework,

2017-12-04 ______ 2017-12-10
2017-11-29 ______ 2017-12-03

это вы откуда взяли? И почему это? Покажите репрезентативный набор данных, а не остатки грелки после Тузика.
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679030
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов, это предыдущие дни календаря, т.е. я хочу получить данные за этот период вместо дат, которые повторяются
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679092
framework,

для имеющейся выборки временных отрезков (Пн-Вс), найти отрезки той же длины, которые не соприкасаются с имеющимися отрезками (т.е. отстоящими от имеющихся на 1 неделю, слева и справа)?
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679095
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
framework,

наверное же какой date такой и dateadd(week, -1).
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679098
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собиратель мифов,
Вы правильно поняли.
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679162
framework,

Сформировать выборку со всеми отрезками.
Исключить (EXCEPT) имеющиеся отрезки.
Исключить отрезки, предшествующие имеющимся.
Исключить отрезки, следующие за имеющимися.
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679188
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собиратель мифов,
при использовании (EXCEPT) нужно исключать, указывая сами отрезки дат, поэтому такой вариант не подходит. Необходимо, чтобы данный скрипт был применим для всех продуктов, у которых эти отрезки дат будут разными. Я думаю в сторону применения условия
типа CASE, IIF

Вот сам скрипт, в Cteprod необходимо это условие

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
With
Cteprom
as
(
select p.GoodsId, pw.WarehouseId, p.PromotionGoodsTimeBegin, p.PromotionGoodsTimeEnd
from PromotionGoods p with(NoLock) join PromotionGroup pg with(NoLock) on p.PromotionGroupId=pg.PromotionGroupId
join PromotionWarehouse pw with(NoLock) on pw.PromotionGroupId=p.PromotionGroupId
where p.GoodsId in (7815)
and pw.WarehouseId in (999)
),

CteprodAMD
as
(
select g.GoodsId, g.GoodsName, c.WarehouseId, SUM(c.Quantity) QuaCredit			
from Goods g with(NoLock), CreditView c with(NoLock) , Cteprom
where g.Goodsid=c.Goodsid
and Cteprom.GoodsId=c.GoodsId
and Cteprom.WarehouseId=c.WarehouseId
and c.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd
group by g.GoodsId, g.GoodsName, c.WarehouseId
),

Cteprod
as
(
select g.GoodsId, g.GoodsName, c.WarehouseId, SUM(c.Quantity) QuaCredit, c.Datex			
from Goods g with(NoLock), CreditView c with(NoLock), Cteprom
where g.Goodsid=c.Goodsid
and Cteprom.GoodsId=c.GoodsId
and Cteprom.WarehouseId=c.WarehouseId
and c.Datex between DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd)
group by g.GoodsId, g.GoodsName, c.WarehouseId, c.Datex
)

select *
from CteprodAMD join Cteprod on CteprodAMD.GoodsId=Cteprod.GoodsId
join Cteprom on Cteprod.GoodsId=Cteprom.GoodsId
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679626
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я пытался создать это условие в case, но сервер не понимает then and
Код: sql
1.
2.
3.
4.
5.
case 
when
Cteprod.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd then DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) 
and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd) 
end
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679629
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
frameworkЯ пытался создать это условие в case, но сервер не понимает then and
Код: sql
1.
2.
3.
4.
5.
case 
when
Cteprod.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd then DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) 
and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd) 
end

А что там делает AND ??
По-вашему, 25 AND 15 на SQL-сервере чему равно?
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679630
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
framework,

замечу, что полей или переменных типа BOOLEAN в T-SQL не бывает.
Как и явного типа BOOLEAN
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679633
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iap, равно >15 and <25
Но как это условие в сервере?
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39679635
framework
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я же в начале с помощью
Код: sql
1.
between

указываю промежуток, можно ли применить
Код: sql
1.
between

после
Код: sql
1.
then

или с помощью какого оператора это сделать на сервере ?
...
Рейтинг: 0 / 0
ломаю голову 3ий день
    #39680208
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
framework,

CASE - это скалярная функция. Возвращает ровно одно значение.
Все логические условия должны быть написаны в WHEN.
В THEN должен быть возвращаемый результат определённого типа.
WHEN и THEN в одном CASE может быть много. Справку не читали?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / ломаю голову 3ий день
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]