Akhil Jain Ответов: 2

Как реализовать эту логику в SQL server ?


пожалуйста, скажите мне, как реализовать эту логику в SQL server я новичок, я запутался, как реализовать это в SQL server с помощью case или if / else
@from и @to - это введенная дата
leas start - дата начала аренды
конец аренды-дата окончания аренды
daydiff-количество дней
для 1.2 по состоянию на 05/09/2016 это будет 1-я дата 2016 года для этого, например: (или любой год)


1.) рейтинговый период
@с @к
01/01/2016 31/12/2016
аренда
1.1) начало и конец
01/02/2016 31/12/2016
затем daydiff(начало аренды)-(конец аренды))

1.2) 01/01/2015 05/09/2016
затем daydiff( 1-й день года (конец аренды)-(05/09/2016))

1.3) 01/01/2015 05/09/2018
затем daydiff(rating @from)-(rating @to)

1.4)01/03/2016 01/09/2016
затем daydiff(lease. start-конец аренды)

2 .Оценкой периода
@с @к
01/03/2016 31/12/2016

аренда

2.1) начало и конец
01/02/2016 31/12/2016
затем daydiff( @from - @to))

2.2) 01/01/2015 05/09/2016
затем daydiff (@from-leas. end)

2.3) 01/01/2015 05/09/2018
затем daydiff (@from-leas. end)

2.4)01/04/2016 01/09/2016
daydiff(lease. start-leas.end)

Что я уже пробовал:

я новичок в Sql server пожалуйста помогите мне как реализовать эту логику в SQL server

CHill60

Не совсем понятно, что вы имеете в виду. Объясните это лучше, расскажите нам, как выглядят таблицы, и приведите некоторые примеры данных. И новичок он или нет, мы ожидаем, что вы сделаете это. некоторые усилие

Akhil Jain

период оценки @from И @and будут введены пользователем, а начало и конец-это столбцы типа даты таблицы leas

CHill60

Недостаточно ясно. Определите таблицу(ы). Объясните "логику" лучше, например, 2.1 для даты начала = 01/02/2016, даты окончания 31/12/2016, тогда что = daydiff(rating period @from-rating period @to))?
Что такое " daydiff"
Где ваши образцы данных? Где ваши ожидаемые результаты
Используйте Улучшить вопрос ссылка

Akhil Jain

daydiff не дней, ч/б from_date и @даты

Akhil Jain

я хочу получить "нет". дней для следующих условий !!

CHill60

Затем правильно сведите эти условия в таблицу. Используйте соответствующие термины-см. 1) для введенных дат между 01/01/2016 и 31/12/2016 аренда - что такое "аренда"?
Покажите структуру таблицы и приведите некоторые примеры данных и ожидаемые результаты.
Произносите вещи правильно и последовательно - что должен означать daydiff(1-й день (leas end0-(05/09/2006))? "1-й день"???
Мы не можем помочь вам, если вы не сформулируете свою проблему ясно. Это, вероятно, самый ценный урок, который вы могли бы усвоить как "Новичок" - четко сформулируйте свои требования

Akhil Jain

сделать PLS видят.нужна помощь

Akhil Jain

пожалуйста, дайте мне знать, что еще вы хотите

2 Ответов

Рейтинг:
19

CHill60

Я сделаю все, что в моих силах, чтобы объяснить вам, что вам нужно, но вы действительно должны прислушиваться к советам и действовать в соответствии с ними. Отвечайте на вопросы, которые вам действительно задают, а не на то, что вы хотите написать.

Чилл60 спросил:
Покажите структуру таблицы и приведите некоторые примеры данных и ожидаемые результаты.
Вероятно, у вас есть таблица, из которой вы хотите извлечь эту информацию. Я догадываюсь, как это может выглядеть, так как вы на самом деле не сказали нам. Я надеялся на что-то подобное...
create table test
(
	id int identity(1,1),
	[lease start] date,
	[lease end] date
)
Некоторые примеры данных:
INSERT INTO test VALUES
('2016-FEB-01', '2016-DEC-31'),
('2016-JAN-01', '2016-SEP-05'),
('2015-JAN-01', '2018-SEP-05'),
('2016-APR-01', '2016-SEP-01'),
('2015-JAN-01', '2016-SEP-05')
Предполагаемые результаты:
id      result
1	365
2	248
3	978
4	153
5	248
Ахил Джайн сказал:
для 1.2 по состоянию на 05/09/2016 это будет 1-я дата 2016 года для этого, например: (или любой год)
Чтобы получить первый день года, вы можете использовать этот фрагмент запроса:
dateadd(yy, datediff(yy, 0, [lease end]), 0)
Ахил Джайн сказал:
daydiff не дней, ч/б from_date и @даты
Функция, которую вы ищете, на самом деле функция DateDiff[^]- чтобы получить результаты в течение нескольких дней, вы можете использовать day, dd или d в качестве первого параметра. Например:
DATEDIFF(day, @from, [lease end])
DATEDIFF(dd, @from, [lease end])
DATEDIFF(d, @from, [lease end])
Чилл60 сказал:
Затем правильно сведите эти условия в таблицу ... Произносите слова правильно и последовательно ...
Если вы составите таблицу дат, которые вы проверяете , например, в электронной таблице, то вы можете обнаружить любые проблемы, совпадения или пробелы. Это также значительно облегчает чтение требований. Я ожидал чего-то вроде:
1) Rating period @from = 01/01/2016 @to 31/12/2016
 
 Reference [lease start]  [lease end]	Calculation (results in days)
 1.1        01/02/2016	  31/12/2016    [lease start] - [lease end]
 1.2        01/01/2015    05/09/2016    1stDayOfYear([lease end]) - (05/09/2016)
 1.3        01/01/2015    05/09/2018    @from- @to
 1.4        01/03/2016    01/09/2016    [lease start] -[lease end]

 2) Rating period @from = 01/03/2016 @to = 31/12/2016

 Reference [lease start]  [lease end]	Calculation (results in days)
 2.1       01/02/2016     31/12/2016    @from - @to
 2.2	   01/01/2015     05/09/2016	@from -[lease end]
 2.3       01/01/2015     05/09/2018    @from -[lease end] 
 2.4       01/04/2016     01/09/2016    [lease start] - [lease end]

Обратите внимание, как я был последователен - все имена столбцов пишутся одинаково вместо leas.start, (lease end), lease.end и т. д.
Входные данные пользователя четко обозначены символом@.
Используя эту таблицу, я могу ясно видеть некоторые проблемы перекрытия (например, 2.2 и 2.3)

Для реализации изменения рейтинговых периодов вам, вероятно, потребуется использовать ЕСЛИ ... ЕЩЕ[^]. Например:
IF @from = '2016-JAN-01' AND  @to = '2016-DEC-31'
	-- a query
ELSE
	-- another query
Для реализации других проверок вам нужно будет использовать ДЕЛО[^]. Частичный пример:
SELECT id,
	CASE WHEN [lease start] = CAST('2016-FEB-01' AS DATE) AND [lease end] = CAST('2016-DEC-31' AS DATE) THEN DATEDIFF(dd, @from, @to)
		 WHEN [lease start] = CAST('2016-JAN-01' AS DATE) AND [lease end] = CAST('2016-SEP-05' AS DATE) THEN DATEDIFF(dd, @from, [lease end])
		 WHEN [lease start] = CAST('2015-JAN-01' AS DATE) AND [lease end] = CAST('2018-SEP-05' AS DATE) THEN DATEDIFF(dd, @from, [lease end])
		 WHEN [lease start] = CAST('2016-APR-01' AS DATE) AND [lease end] = CAST('2016-SEP-01' AS DATE) THEN DATEDIFF(dd, [lease start], [lease end])
		 WHEN [lease start] = CAST('2015-JAN-01' AS DATE) AND [lease end] = CAST('2016-SEP-05' AS DATE) THEN DATEDIFF(dd, dateadd(yy, datediff(yy, 0, [lease end]), 0), CAST('2016-SEP-05' AS DATE))
	END as result
FROM test

Остальное зависит от вас. Если у вас есть еще вопросы, то возвращайтесь, но не забудьте четко сформулировать свою проблему и включить код, который вы пробовали


Akhil Jain

я бы сформулировал универсальный вариант это, извольте видеть, ждет УР комментарии
и огромное спасибо за вашу помощь !!

CHill60

Если это работает для вашего сценария, то у меня нет никаких комментариев.
Кстати, если мое решение помогло вам, то считается вежливым принять решение, и вы можете выбрать более одного решения как помогшее. Считается невежливым публиковать свое собственное решение, получив некоторую помощь, а затем просто принять его - некоторые члены проголосуют против вашего решения только за это.

Akhil Jain

принятые решения ОК УР

CHill60

Спасибо - очень ценю. Не забудьте сделать то же самое для других участников в будущем :-)

Рейтинг:
11

Akhil Jain

@chill60 я сделал общее решение для этого, оно будет работать для выше 2 случаев

INSERT INTO test VALUES
('2016-FEB-01', '2016-DEC-31'),
('2016-JAN-01', '2016-SEP-05'),
('2015-JAN-01', '2018-SEP-05'),
('2016-APR-01', '2016-SEP-01'),
('2015-JAN-01', '2016-SEP-05')
('1997-08-16 00:00:00.000','2010-02-28 00:00:00.000')
('2007-10-01 00:00:00.000','2017-06-30 00:00:00.000')


DECLARE @FROM DATE='2016-Mar-01'
,@to DATE='2016-DEC-31'


SELECT id, 
(CASE 
WHEN @FROM <dbo.test.[lease start]
THEN DATEDIFF(DAY,dbo.test.[lease start],dbo.test.[lease end])

WHEN (@FROM >=[lease start]) AND (@to>=[lease end])
THEN DATEDIFF(DAY,@from,test.[lease end])

WHEN (@FROM >=[lease start]) AND (@to>=[lease end]) AND ((CAST(DATEADD(yy, DATEDIFF(yy, 0,dbo.test.[lease end]), 0) AS DATE) >@FROM))
THEN DATEDIFF(DAY,@from,test.[lease end])

WHEN (@FROM >[lease start]) AND (@to>[lease end])
THEN DATEDIFF(DAY,CAST(DATEADD(yy, DATEDIFF(yy, 0,dbo.test.[lease end]), 0) AS DATE),[lease end])

WHEN (@from > [lease start]) AND ([lease end]>@to)
THEN DATEDIFF(DAY,@FROM,@to)


WHEN ([lease start]>@FROM) AND ([lease end]<@to)
THEN DATEDIFF(DAY,[lease start],[lease end]) ELSE 5 END)
  FROM dbo.test