Выбор номера договора, действовавшего в промежутке времени из таблицы
Станислав--
Дата: 16.02.2010 14:20:01
Искал по форуму, но видимо корректно не могу сформулировать запрос..
Итак, есть таблица
datesign numsign
2010-02-01 00:00:00.000 31
2009-06-01 00:00:00.000 42
2009-07-15 00:00:00.000 49/1
2009-08-14 00:00:00.000 55
2009-09-08 00:00:00.000 60
т.е. это список договоров и даты их введения. соответственно с 15 июля 2009 по 13 августа 2009 действовал договор 49/1 .
мне нужно зная дату выбрать подходящий договор.
идея была такой:
select top(1) * from (
select top 100 percent cast(ufs_nmk as datetime) datesign ,ufs_cds from UFSpr order by datesign ) tmp
where date > datesign
но фокус не удался, сортировка не срабатывала, как можно иначе решить эту задачу ?
Гавриленко Сергей Алексеевич
Дата: 16.02.2010 14:23:40
В чем прикол top 100 percent и сортировки в подзапросе?
Станислав--
Дата: 16.02.2010 14:25:39
выбор первой строки, где дата договора оказалась бы меньше чем исходная дата.
но в этом случае необходимо, чтобы поля были отсортированы по возрастанию, в базе же не отсортированные данные
Гавриленко Сергей Алексеевич
Дата: 16.02.2010 14:28:31
А date - это что за поле такое?
Glory
Дата: 16.02.2010 14:47:09
select *, (select top 1 b.datesign from UFSpr b where b.datesign < a.datesign order by b.datesign desc)
from UFSpr a
Mikle83
Дата: 16.02.2010 15:24:26
Declare @TB Table (datesign datetime, numsign int)
Insert into @TB(datesign , numsign)
Select '20100201', 31
union Select '20090601', 42
union Select '20090715', 49/1
union Select '20090814', 55
union Select '20090908', 60
Declare @D DateTime Set @D = '20090512'
Select
T.datesign, T.numsign, Isnull(Min(T2.datesign), '20500101')
from @TB T
left join @TB T2 on T2.datesign > T.datesign
group by T.DateSign, T.numsign
Having @D between T.DateSign and Min(T2.datesign)
Mikle83
Дата: 16.02.2010 15:26:13
только дату возьмите, которая попадет хотя бы в один период :)
Declare @D DateTime Set @D = '20090512'
Эта дата явно раньше начала любого из договоров
Станислав--
Дата: 17.02.2010 06:51:19
2Гавриленко Сергей Алексеевич:
date - внешняя переменная, т.е. @Date.
----
2Glory:
31 01/02/2010 2009-09-08 00:00:00.000
42 01/06/2009 NULL
49/1 15/07/2009 2009-06-01 00:00:00.000
55 14/08/2009 2009-07-15 00:00:00.000
60 08/09/2009 2009-08-14 00:00:00.000
не отсортирован список, где задать дату - не понял.
set dateformat dmy
select UFS_CdS,UFS_NmK, (select top 1 cast(b.ufs_nmk as datetime) from UFSpr b where cast(b.ufs_nmk as datetime) < cast(a.ufs_nmk as datetime) and ufs_rcd=38 order by cast(b.ufs_nmk as datetime) desc)
from UFSpr a where ufs_rcd=38
---
2Mikle83:
сейчас пробую, в приведённом вами примере все работает, к моему случаю прикручиваю пока что..
Станислав--
Дата: 17.02.2010 08:52:36
Mikle83,
Declare @D DateTime Set @D = '01/01/2010'
Select
cast(t.ufs_nmk as datetime) datesign, T.ufs_cds numsign, Isnull(Min(cast(t2.ufs_nmk as datetime)), '01/01/2020')
from UFSpr T
left join UFSpr T2 on cast(t2.ufs_nmk as datetime) > cast(t.ufs_nmk as datetime) and t2.ufs_rcd=38
where t.ufs_rcd=38
group by cast(t.ufs_nmk as datetime), T.ufs_cds
Having @D between cast(t.ufs_nmk as datetime) and Min(cast(t2.ufs_nmk as datetime))
работает !! спасибо !
Станислав--
Дата: 17.02.2010 08:53:37
Mikle83,
Declare @D DateTime Set @D = '01/01/2010'
Select
cast(t.ufs_nmk as datetime) datesign, T.ufs_cds numsign, Isnull(Min(cast(t2.ufs_nmk as datetime)), '01/01/2020')
from UFSpr T
left join UFSpr T2 on cast(t2.ufs_nmk as datetime) > cast(t.ufs_nmk as datetime) and t2.ufs_rcd=38
where t.ufs_rcd=38
group by cast(t.ufs_nmk as datetime), T.ufs_cds
Having @D between cast(t.ufs_nmk as datetime) and Min(cast(t2.ufs_nmk as datetime))
работает !! спасибо !