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

Откуда: Киев
Сообщений: 1387
ДОБРОГО ВРЕМЕНИ СУТОК

Возникла проблема в написании хранимой процедуры - фильтр по дате за период (неделя)

в базе данные записываются как 19.03.2012 0:00:00 тип поля DateTime

мне необходимо написать запрос который фильтрует данные не учитывая года и времени (пример - с 19.03 по 25.03).
(То есть дни рождения сотрудников не учитывая года)

простые запросы я делать умею а вот с этим как то не получается.

Уже 3 дня в интернете ищу но там все с фильтры идут с годами а мне нужно только день и месяц.

вот название полей таблицы
id - int
name - nvarchar(256)
date - DateTime
text - Text

Спасибо
19 мар 12, 14:56    [12274232]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
VIT2708, а так что уже не устаревает?
where month(date ) between @MonthBegin and @MonthEnd
and day(date ) between @DayBegin and @DayEnd
19 мар 12, 15:04    [12274297]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
lapposv
Member

Откуда: Санкт-Петербург
Сообщений: 27
Есть 2 волшебные функции month(DateTime) и day(DateTime).
Что бы понять что они возвращают можно выполнить
select month(GetDate())
select day(GetDate())


А так, копать в этом направлении.
19 мар 12, 15:07    [12274319]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
denis2710,

поскольку я новичек в написании хранимых процедур, в основном всю обработку я писал на ASP.NET.

@MonthBegin , @DayBegin - можете подсказать что это за параметры или как им назначить значения например:
@DayBegin = CONVERT(day, SYSTEMDATE())
@DayEnd = CONVERT(day, +7 SYSTEMDATE())

это будет правильно?
19 мар 12, 15:15    [12274401]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
VIT2708,
declare @DayBegin int =day(getdate());
declare @MonthBegin int =month(getdate());

select @DayBegin,@MonthBegin
19 мар 12, 15:22    [12274464]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
denis2710,

Спасибо огромное
19 мар 12, 15:25    [12274493]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
А на будущие, полезно читать BOL
19 мар 12, 15:27    [12274511]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
denis2710,

я смотрел. но потом поискал в интернете примеры и запутался
19 мар 12, 15:42    [12274650]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
denis2710
VIT2708, а так что уже не устаревает?
where month(date ) between @MonthBegin and @MonthEnd
and day(date ) between @DayBegin and @DayEnd
И прощай использование индексов...
19 мар 12, 15:51    [12274734]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
invm,

тоже нормально
19 мар 12, 16:02    [12274832]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
VIT2708
invm,

тоже нормально
Что именно нормально? Неиспользование индексов?
19 мар 12, 16:07    [12274864]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
вроде религия еще не запрещает сделать два вычисляемых поля с числом и месяцем и сделать по ним индекс.
19 мар 12, 16:27    [12275056]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
denis2710
вроде религия еще не запрещает сделать два вычисляемых поля с числом и месяцем и сделать по ним индекс.


уж лучше таблицу-справочник тогда на N-лет, если исходная таблица большая
19 мар 12, 16:33    [12275123]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
denis2710
вроде религия еще не запрещает сделать два вычисляемых поля с числом и месяцем и сделать по ним индекс.
И как этот индекс будет работать в вашем запросе?
19 мар 12, 16:36    [12275152]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
вообще тут речь идет про дни рождения сотрудников,а не про перепись населения китая :)
19 мар 12, 16:38    [12275173]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
denis2710
вообще тут речь идет про дни рождения сотрудников,а не про перепись населения китая :)
Это повод учить новичков плохому?
19 мар 12, 16:43    [12275235]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
invm
denis2710
вообще тут речь идет про дни рождения сотрудников,а не про перепись населения китая :)
Это повод учить новичков плохому?

С нетерпением жду вашего лучшего способа.
19 мар 12, 16:52    [12275341]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
denis2710
С нетерпением жду вашего лучшего способа.

Вариант 1:
use tempdb;
go
create table dbo.Test
(
 id int primary key,
 name nvarchar(256),
 [date] datetime,
 [text] text,
 dummy_date as dateadd(d, day([date]) - 1, dateadd(m, month([date]) - 1, '1904'))
);
create index IX_Test__dummy_date (dummy_date);

Вариант 2:
use tempdb;
go
create table dbo.Test
(
 id int primary key,
 name nvarchar(256),
 [date] datetime,
 [text] text,
 month_day as cast(month([date]) * 100 + day([date]) as smallint)
);
create index IX_Test__month_day (month_day);

Надеюсь, не требуется пояснений как использовать?

Можно еще сделать, как вы и предложили, вычисляемые столбцы по month([date]) и day([date]) и индекс по каждому из них. И надеяться на index intersection.
19 мар 12, 17:22    [12275686]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
invm,
Вариант 1
dummy_date as dateadd(d, day([date]) - 1, dateadd(m, month([date]) - 1, '1904'))
говорит не детерминировано.
invm
Надеюсь, не требуется пояснений как использовать?
не надо,спасибо.
19 мар 12, 18:01    [12276142]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
denis2710
invm,
Вариант 1
dummy_date as dateadd(d, day([date]) - 1, dateadd(m, month([date]) - 1, '1904'))
говорит не детерминировано.
invm
Надеюсь, не требуется пояснений как использовать?
не надо,спасибо.
Торопливость никогда до добра не доводит :)
use tempdb;
go
create table dbo.Test
(
 id int primary key,
 name nvarchar(256),
 [date] datetime,
 [text] text,
 dummy_date as dateadd(d, day([date]) - 1, dateadd(m, month([date]), convert(datetime, '19040101', 112)))
);
create index IX_Test__dummy_date on dbo.Test (dummy_date);
go
19 мар 12, 18:13    [12276238]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
denis2710
VIT2708, а так что уже не устаревает?
where month(date ) between @MonthBegin and @MonthEnd
and day(date ) between @DayBegin and @DayEnd
Это не должно работать.

Скажем есть:

@MonthBegin = 5
@MonthEnd = 7
@DayBegin = 10
@DayEnd = 15

Тогда ваш запрос выберет только даты между 10м и 15м числами в мае, июне и июле, в то время как нужно выбрать всё между 10 мая и 15 июля.

Я-бы сделал так:
WHERE datepart(dy,@date) between datepart(dy,@Begin) and datepart(dy,@End)

Где @Begin и @End - нужные месяц-день с любым годом.
19 мар 12, 23:16    [12277872]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
можно еще так
month_day as cast(right(convert(varchar(50), date,112),4) as smallint)
вроде чуток полегче
вариация на
invm
month_day as cast(month([date]) * 100 + day([date]) as smallint)

Еще хотелось бы посмотреть про
Knyazev Alexey
уж лучше таблицу-справочник тогда на N-лет, если исходная таблица большая
20 мар 12, 09:22    [12278981]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
iljy
Member

Откуда:
Сообщений: 8711
denis2710
можно еще так
month_day as cast(right(convert(varchar(50), date,112),4) as smallint)
вроде чуток полегче

Ни при каких обстоятельствах преобразование в строку и обратно не может быть легче операций с числами.
20 мар 12, 11:19    [12279490]     Ответить | Цитировать Сообщить модератору
 Re: Day и Month  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
denis2710
Еще хотелось бы посмотреть про
Knyazev Alexey
уж лучше таблицу-справочник тогда на N-лет, если исходная таблица большая


а чего его смотреть ?
справочник в виде 2х колонок:

1 - "в базе данные записываются как 19.03.2012 0:00:00 тип поля DateTime"
2 - "19.03"

а дальше джойнить исходную таблицу и справочник по полю DateTime,
а условие накладывать на второе поле справочника
20 мар 12, 11:25    [12279526]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить