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

Откуда:
Сообщений: 40
MSSQL 2008 R2
ДАНО:
В кпрограмме клиенте в строковую переменную перезаётся значение из файла вида: '01.02.2013','04.06.2014','05.06.2015'
В клиенте можно делать только простой SELECT к базе, без переменных, бех хранимых процедур.
Нужно:
Проверить является ли текущий день одним из указанных в переменной. С этим проблемн не возникло:
'SELECT CASE WHEN CONVERT(varchar,GETDATE(),104) IN ('+ DayList +') THEN 1 ELSE 0 END'

А так же узнать количество дней содержащихся в переменной в заданном диапазоне. Для этого предпологаю что нужно строку с разделителями пердставить как столбец, простым Битвином отобрать только те значения которые удовлетворяют промежутку и вывести COUNT. Но вот как мне получить столбец?
11 окт 13, 08:44    [14954521]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
kominet
MSSQL 2008 R2
ДАНО:
В кпрограмме клиенте в строковую переменную перезаётся значение из файла вида: '01.02.2013','04.06.2014','05.06.2015'
В клиенте можно делать только простой SELECT к базе, без переменных, бех хранимых процедур.
Нужно:
Проверить является ли текущий день одним из указанных в переменной. С этим проблемн не возникло:
'SELECT CASE WHEN CONVERT(varchar,GETDATE(),104) IN ('+ DayList +') THEN 1 ELSE 0 END'

А так же узнать количество дней содержащихся в переменной в заданном диапазоне. Для этого предпологаю что нужно строку с разделителями пердставить как столбец, простым Битвином отобрать только те значения которые удовлетворяют промежутку и вывести COUNT. Но вот как мне получить столбец?


1) у вас три даты, а диапазон один? с 1 по 3ю?
2) в базе создайте таблицу календарь, и сделайте выбору из нее
11 окт 13, 09:23    [14954634]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
3) какое-то у меня подозрение что это у вас всё таки не работает:
'SELECT CASE WHEN CONVERT(varchar,GETDATE(),104) IN ('+ DayList +') THEN 1 ELSE 0 END'
11 окт 13, 09:25    [14954643]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
StarikNavy, дат бывает произвольное количество от 2х до 138
Запрос работает. Это строка из клиента, если убрать апостровы а DayList заменить вручную на строку с датами то работает и в sql. В целом сейчас решил эту проблемму формируя текст запроса в клиенте, но может кто знает более "изящное" решение?
11 окт 13, 09:37    [14954694]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
kominet
StarikNavy, дат бывает произвольное количество от 2х до 138
Запрос работает. Это строка из клиента, если убрать апостровы а DayList заменить вручную на строку с датами то работает и в sql. В целом сейчас решил эту проблемму формируя текст запроса в клиенте, но может кто знает более "изящное" решение?


мля
1) вас о чем спрашивал, если дат много, то КАКОЙ ДИПАЗОН интересует?
2) изящное по сравнению с чем? с тем решением которое вы не привели?
11 окт 13, 10:16    [14954900]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
Glory
Member

Откуда:
Сообщений: 104751
kominet
Это строка из клиента, если убрать апостровы а DayList заменить вручную на строку с датами то работает и в sql.

И почему бы клиенту сразу не добавлять даты в какую нибудь таблицу ? По одной дате в каждую запись
11 окт 13, 10:25    [14954946]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

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

1) Диапазон произвольный, т.е. например с 01.02.2013 по 02.03.2014
2) Я в кратце пописал... сейчас делаю в клиенте составлением строки запроса, обрабатывая в цикле строку с датами, получаю запрос вида:

SELECT COUNT(VhPr) FROM (
SELECT CONVERT(date,'05.10.2013') VhPr
UNION
SELECT CONVERT(date,'06.10.2013') VhPr
UNION
SELECT CONVERT(date,'12.10.2013') VhPr
UNION
SELECT CONVERT(date,'13.10.2013') VhPr
UNION
SELECT CONVERT(date,'19.10.2013') VhPr
UNION
SELECT CONVERT(date,'04.11.2013') VhPr)VhPrList
WHERE VhPr BETWEEN '01.10.2013' AND '30.10.2013'
11 окт 13, 10:35    [14955003]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
aleks2
Guest
[src]
CREATE function [dbo].[StrToTable](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number )
AS
(
select 1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number
UNION ALL
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
)
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
[\src]

Сами ужо выньте из функции запрос и вколбасьте его в свой.
11 окт 13, 10:36    [14955006]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
Glory
Member

Откуда:
Сообщений: 104751
kominet
1) Диапазон произвольный, т.е. например с 01.02.2013 по 02.03.2014

В вашем пеовом примере 3 даты - '01.02.2013','04.06.2014','05.06.2015'
Это сколько диапазонов ?
11 окт 13, 10:36    [14955009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
Glory,
Что касается я добавления записей в клиенте, изменять что либо возможности нет. Но даже если бы была, строка с датами считывается из файла, в который даты выгружаются из стороннего софта. к которому опять же нет никакого доступа.
11 окт 13, 10:37    [14955019]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
Glory
Member

Откуда:
Сообщений: 104751
kominet
Что касается я добавления записей в клиенте, изменять что либо возможности нет.

kominet
сейчас делаю в клиенте составлением строки запроса,

Какое из этих двух утверждений правдиво ?
11 окт 13, 10:39    [14955031]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
Glory, дат может быть очень много.. это не диапазоны. Нужно посчитать сколько дат из этого списка ВХОДЯТ в заданный диапазон.
11 окт 13, 10:39    [14955037]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
FantomGood
Member

Откуда: Херсон
Сообщений: 340
добавьте на сервере пользовательскую функцию Split (реализацию можно найти или написать самому) и вызывайте ее запросе
select * from dbo.split(DayList ,',')
и вычисляйте что необходимо
11 окт 13, 10:40    [14955044]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
aleks2
[src]
CREATE function [dbo].[StrToTable](@str varchar(8000), @delimiter varchar(64)=',')
returns table as
return(
WITH str_nums ( n1, n2, Number )
AS
(
select 1-DATALENGTH(@delimiter) as n1, charindex(@delimiter, @str+@delimiter) as n2, 0 as Number
UNION ALL
select n2 as n1, charindex(@delimiter, @str+@delimiter, n2+DATALENGTH(@delimiter)) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH(@str)
)
SELECT SUBSTRING(@str, n1+DATALENGTH(@delimiter), n2-n1-DATALENGTH(@delimiter)) as Value, Number, n1+DATALENGTH(@delimiter) as StartPosition FROM str_nums
)
[\src]

Сами ужо выньте из функции запрос и вколбасьте его в свой.


Как указал в первом посту, не могу использовать НИ хранимые процедуры, ни что либо вообще вносить в базу, только простой SELECT... даже переменные нельзя использовать.
11 окт 13, 10:41    [14955049]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
Glory
kominet
Что касается я добавления записей в клиенте, изменять что либо возможности нет.

kominet
сейчас делаю в клиенте составлением строки запроса,

Какое из этих двух утверждений правдиво ?

Оба!
1) Нет возможности ничего менять в функциях которые выполняют INSERT или UPDATE (собственно)
2) Есть возможность работать с строковыми переменными как угодно, и вставлять строковую переменную в функцию клиента "ExecSelectSQL", из названия думаю понятна что эта функция делает.
11 окт 13, 10:50    [14955106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kominet
aleks2
Сами ужо выньте из функции запрос и вколбасьте его в свой.

Как указал в первом посту, не могу использовать НИ хранимые процедуры, ни что либо вообще вносить в базу, только простой SELECT... даже переменные нельзя использовать.

При чём здесь хранимые процедуры? Вместо @str подставьте вашу исходную строку: '01.02.2013','04.06.2014','05.06.2015'. Вместо @delimiter — запятую. Получится что-то вроде:
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select 1-DATALENGTH(',') as n1, charindex(',', '''01.02.2013'',''04.06.2014'',''05.06.2015'''+',') as n2, 0 as Number 
UNION ALL 
select n2 as n1, charindex(',', '''01.02.2013'',''04.06.2014'',''05.06.2015'''+',', n2+DATALENGTH(',')) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH('''01.02.2013'',''04.06.2014'',''05.06.2015''')
) 
SELECT SUBSTRING('''01.02.2013'',''04.06.2014'',''05.06.2015''', n1+DATALENGTH(','), n2-n1-DATALENGTH(',')) as Value, Number, n1+DATALENGTH(',') as StartPosition FROM str_nums
11 окт 13, 11:32    [14955437]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Это что лаба по БД?

Почему нельзя использовать переменные?
Разве есть такое ограничение прав в mssql - запрещающее использовать переменные в запросе?
11 окт 13, 11:39    [14955517]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
Гость333
kominet
пропущено...

Как указал в первом посту, не могу использовать НИ хранимые процедуры, ни что либо вообще вносить в базу, только простой SELECT... даже переменные нельзя использовать.

При чём здесь хранимые процедуры? Вместо @str подставьте вашу исходную строку: '01.02.2013','04.06.2014','05.06.2015'. Вместо @delimiter — запятую. Получится что-то вроде:
WITH str_nums ( n1, n2, Number ) 
AS 
( 
select 1-DATALENGTH(',') as n1, charindex(',', '''01.02.2013'',''04.06.2014'',''05.06.2015'''+',') as n2, 0 as Number 
UNION ALL 
select n2 as n1, charindex(',', '''01.02.2013'',''04.06.2014'',''05.06.2015'''+',', n2+DATALENGTH(',')) as n2, Number+1 as Number
from str_nums
WHERE n2<DATALENGTH('''01.02.2013'',''04.06.2014'',''05.06.2015''')
) 
SELECT SUBSTRING('''01.02.2013'',''04.06.2014'',''05.06.2015''', n1+DATALENGTH(','), n2-n1-DATALENGTH(',')) as Value, Number, n1+DATALENGTH(',') as StartPosition FROM str_nums

ааа не понял.. спасибо, со второго раза дошло ) буду пробовать!
11 окт 13, 11:44    [14955571]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2415
и научитесь хотя бы грамотно формулировать требуемое с самого начала

kominet
А так же узнать количество дней содержащихся в переменной в заданном диапазоне


kominet
дат может быть очень много.. это не диапазоны. Нужно посчитать сколько дат из этого списка ВХОДЯТ в заданный диапазон.
11 окт 13, 11:51    [14955620]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом. Из строки с разделителями получить столбец/  [new]
kominet
Member

Откуда:
Сообщений: 40
StarikNavy
и научитесь хотя бы грамотно формулировать требуемое с самого начала

kominet
А так же узнать количество дней содержащихся в переменной в заданном диапазоне


kominet
дат может быть очень много.. это не диапазоны. Нужно посчитать сколько дат из этого списка ВХОДЯТ в заданный диапазон.


эмм.. прошу прощения если не правильно сформулировал.. НО.. в переменной содержатся ДНИ.. нужно узнать количесвто дней из этой переменной которые содержатся в любом заданном диапазоне? как сформулировать по другому? В любом случае всем спасибо.
11 окт 13, 11:58    [14955647]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить