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

Откуда:
Сообщений: 12
Доброго времени суток,
подскажите каким образом можно сравнить даты, чтобы день отличался +-2 дня, месяц тот же, а год любой.
Объясню задачу - необходимо отобрать с таблицы продаж, те продажи которые были совершены в +-2 дня от дня рождения клиента.
набросал такой селект, он срабатывает, но не так как нужно естественно, от отбирает только те продажи которые совершены в этот же год что и продажа (да косяк есть в базе с датами рождения)
Не силен в sql к сожалению, надеюсь на Вашу помощь

SELECT  
Tc_Client.FNAME,
Tc_Client.prc as '% скидки',
Tc_Client.BORN as 'born',
VYKF_CHECK_SALES.DAY_ID as 'Дата продажи',
VYKD_INT_OBJECTS.OBJ_NAME as 'Магазин'
FROM [CRM].[dbo].[VYKF_CHECK_SALES] as VYKF_CHECK_SALES 
LEFT JOIN   [CRM].[dbo].[Tc_Client] as Tc_Client
ON VYKF_CHECK_SALES.CLIENT_ID = Tc_Client.ID_TX

LEFT JOIN   [CRM].[dbo].[VYKF_CHECK_SALE_CRM] as VYKF_CHECK_SALE_CRM
ON VYKF_CHECK_SALES.CHECK_ID = VYKF_CHECK_SALE_CRM.CHECK_HDR  

LEFT JOIN   [CRM].[dbo].[VYKD_INT_OBJECTS] as VYKD_INT_OBJECTS
ON VYKF_CHECK_SALE_CRM.INT_OBJECT_ID = VYKD_INT_OBJECTS.OBJECTS_ID 


WHERE 	not Tc_Client.BORN is null
and  Tc_Client.BORN  BETWEEN DATEADD(dd,-2,VYKF_CHECK_SALES.Tdate) AND DATEADD(dd,2,VYKF_CHECK_SALES.Tdate)
GROUP BY Tc_Client.FNAME, Tc_Client.prc, VYKF_CHECK_SALES.DAY_ID, VYKD_INT_OBJECTS.OBJ_NAME, Tc_Client.BORN
ORDER BY Tc_Client.FNAME
18 окт 19, 10:31    [21997160]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
orensymrak
чтобы день отличался +-2 дня, месяц тот же, а год любой.
Приведите всё к одному году, например:
and  dateadd(year, -year(Tc_Client.BORN), Tc_Client.BORN) BETWEEN
	DATEADD(dd,-2,dateadd(year, -year(VYKF_CHECK_SALES.Tdate), VYKF_CHECK_SALES.Tdate)) 
	AND 
	DATEADD(dd,2,dateadd(year, -year(VYKF_CHECK_SALES.Tdate), VYKF_CHECK_SALES.Tdate))
18 окт 19, 10:39    [21997168]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
alexeyvg
dateadd(year, -year(Tc_Client.BORN), Tc_Client.BORN)
Только, что бы не было переполнения, нужно приводить не к нулевому году, а куда нибудь поближе, например, к 2000-у:
dateadd(year, 2000-year(Tc_Client.BORN), Tc_Client.BORN)
18 окт 19, 10:42    [21997176]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
orensymrak
Member

Откуда:
Сообщений: 12
alexeyvg,
ОГРОМНОЕ спасибо, это именно то что нужно, и да приведение к 2000 более точнее сработало! Конечно же привел к своему году ближе
18 окт 19, 11:09    [21997213]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
orensymrak
приведение к 2000 более точнее сработало! Конечно же привел к своему году ближе
От года точность не зависит, главное, что бы не было переполнения (год которого зависит от типа данных)
18 окт 19, 11:13    [21997218]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
orensymrak
Member

Откуда:
Сообщений: 12
alexeyvg,
еще такой вопрос как обнулить часы минуты секунды, а то попался такой клиент у которого была продажа 2019-09-22 10:54:08.000, а дата рождения 1982-09-20 00:00:00.000, соответственно -2 не захватывает эту продажу, ставлю +-3 тогда продажа попадает, но и тогда попадают продажи и в разность 3 дня
DATEADD(dd,-2,dateadd
18 окт 19, 11:34    [21997252]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
Владислав Колосов
Member

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

Вы можете использовать abs(datediff...), с between избыточно и не точно.
18 окт 19, 12:02    [21997286]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
komrad
Member

Откуда:
Сообщений: 5244
orensymrak
alexeyvg,
как обнулить часы минуты секунды

можно конвертнуть в date
convert(date,'20190101 10:23:56')

либо посчитать разницу в днях от даты в прошлом
dateadd(dd,datediff(dd,0,ДАТА),0)
18 окт 19, 12:08    [21997293]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
orensymrak
Member

Откуда:
Сообщений: 12
В принципе разобрался, на начало дня дата бралась поэтому переделал сравнивание и сделал -2 и +3 и тогда все отлично сработало

and  dateadd(year, 1950-year(VYKF_CHECK_SALES.Tdate), VYKF_CHECK_SALES.Tdate) >=
	DATEADD(dd,-2,dateadd(year, 1950-year(Tc_Client.BORN), Tc_Client.BORN)) 
	AND dateadd(year, 1950-year(VYKF_CHECK_SALES.Tdate), VYKF_CHECK_SALES.Tdate)  <=
	DATEADD(dd,3,dateadd(year, 1950-year(Tc_Client.BORN), Tc_Client.BORN))
18 окт 19, 12:22    [21997301]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
Владислав Колосов
Member

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

...
AND MONTH(Tc_Client.BORN) = MONTH(VYKF_CHECK_SALES.Tdate)
AND ABS(DAY(Tc_Client.BORN) - DAY(VYKF_CHECK_SALES.Tdate)) <= 2
...
18 окт 19, 12:46    [21997329]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
Tigrist
Member

Откуда: Россия-Таиланд-Корея
Сообщений: 478
Владислав Колосов,

А проблемы клиентов, которые родились в последние 2 или начальные два дня месяца попадают продажи только в свой месяц?

Оскорбление чувств родившихся на границе месяцев (и года))))
18 окт 19, 13:10    [21997365]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
Владислав Колосов
Member

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

да, верно :) С датами так нельзя обращаться!
18 окт 19, 13:19    [21997376]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
orensymrak
Member

Откуда:
Сообщений: 12
Дабы не плодить темы, спрошу в своей же теме))
Подскажите как объединить столбцы с CASE

SELECT        T_Models.ModelID AS ART, 
case when T_Objects.Object = 205 then SUM(T_Transactions.Quantity) else 0 end as МД,
case when T_Objects.Object = 208 then SUM(T_Transactions.Quantity) else 0 end as МДЦ,
SUM(T_Transactions.Quantity) AS ostatki
FROM            T_Transactions INNER JOIN
                         T_Objects INNER JOIN
                         T_Headers ON T_Objects.ID = T_Headers.ID_Objects ON T_Transactions.ID_Headers = T_Headers.ID INNER JOIN
                         T_PLU ON T_Transactions.ID_PLU = T_PLU.ID INNER JOIN
                         T_Models ON T_PLU.ID_Models = T_Models.ID
WHERE        (T_Headers.Status = 0 OR
                         T_Headers.Status = 1 OR
                         T_Headers.Status = 2) AND (T_Headers.ID_Moves = 2 OR
                         T_Headers.ID_Moves = 3 OR
                         T_Headers.ID_Moves = 4 OR
                         T_Headers.ID_Moves = 5 OR
                         T_Headers.ID_Moves = 6)and T_Models.ModelID = 'M_MJA329_FA5030/NERO'
GROUP BY T_Models.ModelID, T_Objects.Object
HAVING        (SUM(T_Transactions.Quantity) > 0)
						 


Результат:
ART	               МД	МДЦ	ostatki
M_MJA329_FA5030/NERO	2	0	2
M_MJA329_FA5030/NERO	0	2	2


В итоге я хочу получить 1 строку
M_MJA329_FA5030/NERO	2	2	4
24 окт 19, 13:06    [22001615]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
court
Member

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

SUM - вынеси до case
T_Objects.Object - убери из GROUP BY
24 окт 19, 13:16    [22001623]     Ответить | Цитировать Сообщить модератору
 Re: Операции с датами  [new]
orensymrak
Member

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

Спасибо, получилось так как надо, глупо было не догадаться))
24 окт 19, 13:52    [22001665]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить