powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Операции с датами
15 сообщений из 15, страница 1 из 1
Операции с датами
    #39878064
orensymrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток,
подскажите каким образом можно сравнить даты, чтобы день отличался +-2 дня, месяц тот же, а год любой.
Объясню задачу - необходимо отобрать с таблицы продаж, те продажи которые были совершены в +-2 дня от дня рождения клиента.
набросал такой селект, он срабатывает, но не так как нужно естественно, от отбирает только те продажи которые совершены в этот же год что и продажа (да косяк есть в базе с датами рождения)
Не силен в sql к сожалению, надеюсь на Вашу помощь

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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
...
Рейтинг: 0 / 0
Операции с датами
    #39878068
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orensymrakчтобы день отличался +-2 дня, месяц тот же, а год любой.Приведите всё к одному году, например:
Код: sql
1.
2.
3.
4.
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))
...
Рейтинг: 0 / 0
Операции с датами
    #39878074
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Код: sql
1.
dateadd(year, -year(Tc_Client.BORN), Tc_Client.BORN)

Только, что бы не было переполнения, нужно приводить не к нулевому году, а куда нибудь поближе, например, к 2000-у:
Код: sql
1.
dateadd(year, 2000-year(Tc_Client.BORN), Tc_Client.BORN)
...
Рейтинг: 0 / 0
Операции с датами
    #39878107
orensymrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
ОГРОМНОЕ спасибо, это именно то что нужно, и да приведение к 2000 более точнее сработало! Конечно же привел к своему году ближе
...
Рейтинг: 0 / 0
Операции с датами
    #39878111
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orensymrakприведение к 2000 более точнее сработало! Конечно же привел к своему году ближеОт года точность не зависит, главное, что бы не было переполнения (год которого зависит от типа данных)
...
Рейтинг: 0 / 0
Операции с датами
    #39878139
orensymrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,
еще такой вопрос как обнулить часы минуты секунды, а то попался такой клиент у которого была продажа 2019-09-22 10:54:08.000, а дата рождения 1982-09-20 00:00:00.000, соответственно -2 не захватывает эту продажу, ставлю +-3 тогда продажа попадает, но и тогда попадают продажи и в разность 3 дня
Код: sql
1.
DATEADD(dd,-2,dateadd
...
Рейтинг: 0 / 0
Операции с датами
    #39878164
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orensymrak,

Вы можете использовать abs(datediff...), с between избыточно и не точно.
...
Рейтинг: 0 / 0
Операции с датами
    #39878171
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orensymrakalexeyvg,
как обнулить часы минуты секунды
можно конвертнуть в date
Код: sql
1.
convert(date,'20190101 10:23:56')


либо посчитать разницу в днях от даты в прошлом
Код: sql
1.
dateadd(dd,datediff(dd,0,ДАТА),0)
...
Рейтинг: 0 / 0
Операции с датами
    #39878177
orensymrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе разобрался, на начало дня дата бралась поэтому переделал сравнивание и сделал -2 и +3 и тогда все отлично сработало

Код: sql
1.
2.
3.
4.
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))
...
Рейтинг: 0 / 0
Операции с датами
    #39878199
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orensymrak,

Код: sql
1.
2.
3.
4.
...
AND MONTH(Tc_Client.BORN) = MONTH(VYKF_CHECK_SALES.Tdate)
AND ABS(DAY(Tc_Client.BORN) - DAY(VYKF_CHECK_SALES.Tdate)) <= 2
...
...
Рейтинг: 0 / 0
Операции с датами
    #39878222
Фотография Tigrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

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

Оскорбление чувств родившихся на границе месяцев (и года))))
...
Рейтинг: 0 / 0
Операции с датами
    #39878228
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tigrist,

да, верно :) С датами так нельзя обращаться!
...
Рейтинг: 0 / 0
Операции с датами
    #39880927
orensymrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дабы не плодить темы, спрошу в своей же теме))
Подскажите как объединить столбцы с CASE

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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)
						 



Результат:
Код: sql
1.
2.
3.
ART	               МД	МДЦ	ostatki
M_MJA329_FA5030/NERO	2	0	2
M_MJA329_FA5030/NERO	0	2	2



В итоге я хочу получить 1 строку
Код: sql
1.
M_MJA329_FA5030/NERO	2	2	4
...
Рейтинг: 0 / 0
Операции с датами
    #39880931
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orensymrak,

SUM - вынеси до case
T_Objects.Object - убери из GROUP BY
...
Рейтинг: 0 / 0
Операции с датами
    #39880963
orensymrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,

Спасибо, получилось так как надо, глупо было не догадаться))
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Операции с датами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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