Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
Нужно отобрать данные с промежутком дат -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

К сообщению приложен файл. Размер - 57Kb
25 июл 18, 13:27    [21601062]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20514
framework
эти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24
чёта не очень они совпадают... попробуйте объяснить задачу как-то по-иному, ни хрена ж не понять.
25 июл 18, 14:26    [21601232]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
aleks222
Member

Откуда:
Сообщений: 949
Akina
framework
эти даты совпадают
2017-12-25 2017-12-31
2017-12-18 2017-12-24
чёта не очень они совпадают... попробуйте объяснить задачу как-то по-иному, ни хрена ж не понять.


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

Тут, без волюнтаризма, никуда.
25 июл 18, 14:33    [21601261]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Наверное "не пересекались"
25 июл 18, 14:34    [21601268]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
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
25 июл 18, 15:29    [21601569]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
Подскажите, как написать запрос, который бы сравнивал данные за последний период таким образом, чтобы эти даты не пересекались из табл(см. скрин) и период был одинаковый?

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

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

К сообщению приложен файл. Размер - 69Kb
25 июл 18, 15:38    [21601626]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Точно, узнаю, вы профессиональные писцы тех. заданий
25 июл 18, 15:39    [21601634]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7746
framework,

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

это вы откуда взяли? И почему это? Покажите репрезентативный набор данных, а не остатки грелки после Тузика.
25 июл 18, 15:40    [21601651]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
Владислав Колосов, это предыдущие дни календаря, т.е. я хочу получить данные за этот период вместо дат, которые повторяются
2017-12-25 _____ 2017-12-31
2017-12-18 _____ 2017-12-24
25 июл 18, 15:44    [21601678]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
Собиратель мифов
Member

Откуда:
Сообщений: 10
framework,

для имеющейся выборки временных отрезков (Пн-Вс), найти отрезки той же длины, которые не соприкасаются с имеющимися отрезками (т.е. отстоящими от имеющихся на 1 неделю, слева и справа)?
25 июл 18, 16:22    [21601844]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7746
framework,

наверное же какой date такой и dateadd(week, -1).
25 июл 18, 16:24    [21601852]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
Собиратель мифов,
Вы правильно поняли.
25 июл 18, 16:26    [21601859]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
Собиратель мифов
Member

Откуда:
Сообщений: 10
framework,

Сформировать выборку со всеми отрезками.
Исключить (EXCEPT) имеющиеся отрезки.
Исключить отрезки, предшествующие имеющимся.
Исключить отрезки, следующие за имеющимися.
25 июл 18, 17:23    [21602071]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
Собиратель мифов,
при использовании (EXCEPT) нужно исключать, указывая сами отрезки дат, поэтому такой вариант не подходит. Необходимо, чтобы данный скрипт был применим для всех продуктов, у которых эти отрезки дат будут разными. Я думаю в сторону применения условия
типа CASE, IIF

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

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
25 июл 18, 17:49    [21602216]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
Я пытался создать это условие в case, но сервер не понимает then and
case 
when
Cteprod.Datex between Cteprom.PromotionGoodsTimeBegin and Cteprom.PromotionGoodsTimeEnd then DATEADD (week, -1, Cteprom.PromotionGoodsTimeBegin) 
and DATEADD (week, -1, Cteprom.PromotionGoodsTimeEnd) 
end
26 июл 18, 13:59    [21604373]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
framework
Я пытался создать это условие в case, но сервер не понимает then and
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-сервере чему равно?
26 июл 18, 14:04    [21604401]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
framework,

замечу, что полей или переменных типа BOOLEAN в T-SQL не бывает.
Как и явного типа BOOLEAN
26 июл 18, 14:06    [21604413]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
iap, равно >15 and <25
Но как это условие в сервере?
26 июл 18, 14:11    [21604444]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
framework
Member

Откуда:
Сообщений: 16
я же в начале с помощью
between
указываю промежуток, можно ли применить
between
после
then
или с помощью какого оператора это сделать на сервере ?
26 июл 18, 14:15    [21604473]     Ответить | Цитировать Сообщить модератору
 Re: ломаю голову 3ий день  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
framework,

CASE - это скалярная функция. Возвращает ровно одно значение.
Все логические условия должны быть написаны в WHEN.
В THEN должен быть возвращаемый результат определённого типа.
WHEN и THEN в одном CASE может быть много. Справку не читали?
27 июл 18, 13:51    [21608270]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить