Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Запрос с date  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
у вас, ваше "Dates" какого типа?
приведите пример вашей "даты" когда, например, один из параметров is null.
24 ноя 16, 23:10    [19932053]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37143
https://www.sql.ru/faq/faq_topic.aspx?fid=114
25 ноя 16, 00:48    [19932249]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
aleks2
Guest
LazzyMind
Дедушка,
тип Dates date

Вид одного из восьми селектов
If @day is not null and @month is not null
Select *
From blabla
Where day(dates) =@day and month(dates)=@month



А в примере невозможного запроса я лишь показал ,например если год отсутствует нужно выбрать за все года указанного месяца и дня


Select *
From blabla
Where ( @day is null or day(dates) = @day ) and ( @month is null or month(dates) = @month )

Год ужо сам приделаешь...
Индексы, канешно, отдыхают.
25 ноя 16, 06:13    [19932379]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Спасибо разобрался
25 ноя 16, 07:56    [19932469]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
ncux199rus
Member

Откуда:
Сообщений: 139
LazzyMind, Поделись, пожалуйста, решением.
25 ноя 16, 10:40    [19932890]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
LazzyMind
Member

Откуда:
Сообщений: 44
Ennor Tiegael



по-моему отлично все расписал
25 ноя 16, 18:01    [19935757]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
aleks2
Guest
Ennor Tiegael
Вам нужен справочник дат, как в варехаусах обычно делается.

Ну например:
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, 18:39    [19935883]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с date  [new]
Руслан Дамирович
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 Ответить