Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
LazzyMind Member Откуда: Сообщений: 44 |
у меня есть три переменные DECLARE @day int ; DECLARE @month int ; DECLARE @year int; Они могут быть null ,могут быть равны какому-то числу те всего 8 вариантов мне нужен запрос вида select * from blabla where Dates like 'isNull(@day,__)+'/'+isNull(@month,__)+'/'+isNull(@year,__)' я могу написать 8 разных селектов в 8 if ,но можно ли это сделать как-то одной строчкой |
24 ноя 16, 21:47 [19931761] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
у вас, ваше "Dates" какого типа? приведите пример вашей "даты" когда, например, один из параметров is null. |
24 ноя 16, 23:10 [19932053] Ответить | Цитировать Сообщить модератору |
LazzyMind Member Откуда: Сообщений: 44 |
Дедушка,
тип Dates date
Вид одного из восьми селектов If @day is not null and @month is not null Select * From blabla Where day(dates) =@day and month(dates)=@month А в примере невозможного запроса я лишь показал ,например если год отсутствует нужно выбрать за все года указанного месяца и дня |
24 ноя 16, 23:35 [19932122] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
https://www.sql.ru/faq/faq_topic.aspx?fid=114 |
25 ноя 16, 00:48 [19932249] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Select * From blabla Where ( @day is null or day(dates) = @day ) and ( @month is null or month(dates) = @month ) Год ужо сам приделаешь... Индексы, канешно, отдыхают. |
||
25 ноя 16, 06:13 [19932379] Ответить | Цитировать Сообщить модератору |
Ennor Tiegael Member Откуда: Сообщений: 3348 |
Вам нужен справочник дат, как в варехаусах обычно делается. Ну например: create table dbo.DimDate ( DateKey date primary key, DateYear smallint not null, DateMonth tinyint not null, DateDay tinyint not null ); Заполняете ее один раз, делаете индексы по году, месяцу и дню, после чего ищете, как по приведенной выше ссылке (лично я предпочитаю nullif(), разницы нет, а код компактнее получается): select ao.* from sys.all_objects ao inner join dbo.DimDate d on cast(ao.create_date as date) = d.DateKey where nullif(@day, d.DateDay) is null and nullif(@month, d.DateMonth) is null and nullif(@year, d.DateYear) is null; |
25 ноя 16, 06:25 [19932389] Ответить | Цитировать Сообщить модератору |
LazzyMind Member Откуда: Сообщений: 44 |
Спасибо разобрался |
25 ноя 16, 07:56 [19932469] Ответить | Цитировать Сообщить модератору |
ncux199rus Member Откуда: Сообщений: 139 |
LazzyMind, Поделись, пожалуйста, решением. |
25 ноя 16, 10:40 [19932890] Ответить | Цитировать Сообщить модератору |
LazzyMind Member Откуда: Сообщений: 44 |
по-моему отлично все расписал |
||
25 ноя 16, 18:01 [19935757] Ответить | Цитировать Сообщить модератору |
aleks2
Guest |
Стисняюсь спросить: индексы тут нахера? |
||
25 ноя 16, 18:39 [19935883] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Раз уж тип DATE, может тупо сформировать таблицу с датами, которые попадут в выборку? Ну так, чисто поржать...DECLARE @d INT = NULL; DECLARE @m INT = NULL; DECLARE @y INT = NULL; ; DECLARE @date_min DATE; DECLARE @date_max DATE; ; SELECT @date_min = MIN( create_date ), @date_max = DATEADD( DAY, 1, MAX( create_date ) ) FROM sys.all_objects ; DECLARE @dates TABLE ( [date] DATE NOT NULL PRIMARY KEY ); WITH d ( [date], [y], [m], [d] ) AS ( SELECT [date] = @date_min, [y] = DATEPART( YEAR, @date_min ), [m] = DATEPART( MONTH, @date_min ), [d] = DATEPART( DAY, @date_min ) UNION ALL SELECT [date] = ss.[date], [y] = DATEPART( YEAR, ss.[date] ), [m] = DATEPART( MONTH, ss.[date] ), [d] = DATEPART( DAY, ss.[date] ) FROM d CROSS APPLY ( SELECT [date] = DATEADD( DAY, 1, d.[date] ) ) ss WHERE d.[date] < @date_max ) INSERT INTO @dates SELECT [date] FROM d WHERE ISNULL( @d, d.[d] ) = d.[d] AND ISNULL( @m, d.[m] ) = d.[m] AND ISNULL( @y, d.[y] ) = d.[y] OPTION ( MAXRECURSION 0 ) ; SELECT o.* FROM @dates d INNER JOIN sys.all_objects o ON ( CONVERT( DATE, o.[create_date] ) = d.[date] ) ; |
25 ноя 16, 19:04 [19935981] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |