Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста, составить запрос!!! :0( / 7 сообщений из 7, страница 1 из 1
04.12.2001, 13:06
    #32018424
Timur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
Есть поле дат (от 01.01.1997 до 04.12.2001).
Но какие-то даты отсутствуют (праздники, выходные и т.д.)
Необходимо вывести те даты, которых в таблице нет.
Понимаю, что вопрос типичный, но , полистав форум, ответа не нашел (может проглядел?)
Один вариант я знаю (сделать таблицу с датами без пропусков и сравнить с исходной, но... это топорно).
Можно ли сделать это запросом, а не хранимой процедурой?
...
Рейтинг: 0 / 0
04.12.2001, 13:37
    #32018425
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
Так как отсутствующие даты - объекты виртуальные, в реальных таблицах их нет, то чтобы их получить в виде результата, их нужно создавать. Это должна быть постоянная или временная таблица. Других способов, помоему, не существует.
...
Рейтинг: 0 / 0
04.12.2001, 13:43
    #32018426
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
На самом деле вариант с таблицей с датами без пропусков не такой уж топорный. Еще лучше иметь таблицу просто с числами, допустим от 0 до 999. В данном случае, учитывая что праздники не бывают больше 4-х дней можно написать так:

Допустим у нас таблица Dates(date datetime)

select destinct dateadd(dd,n.i,d1.date) date
from Dates d1, (select 1 i union select 2 union select 3 union select 4) as n
where not exists(select * from Dates d2 where d2.date=dateadd(dd,n.i,d1.date))
...
Рейтинг: 0 / 0
04.12.2001, 14:04
    #32018432
Timur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
Огромное спасибо всем!!!
P.S.
Я тоже думал, откуда же мне взять даты которых в таблице нет...

2 SergSuper
За Ваш запрос огромное спасибо - интересная "штучка".
...
Рейтинг: 0 / 0
04.12.2001, 16:23
    #32018434
Timur Sokolov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
как говорится, решение в лоб, но дешево, надежно и практично


use pubs
go

set nocount on

create table dates (date datetime)

insert into dates values('20010101')
insert into dates values('20010102')
insert into dates values('20010103')
insert into dates values('20010105')
insert into dates values('20010106')
insert into dates values('20010108')
insert into dates values('20010110')
insert into dates values('20010112')
insert into dates values('20010113')
insert into dates values('20010116')
insert into dates values('20010117')
insert into dates values('20010122')
insert into dates values('20010123')
insert into dates values('20010125')
insert into dates values('20010126')
insert into dates values('20010130')

select date
from dates
order by 1

create table #dates (date datetime)

declare @i datetime, @j datetime

select @i = min(date), @j = max(date)
from dates

while (@i < @j) begin

if not exists (select date from dates where date = @i)

insert into #dates values(@i)

Set @i = @i + 1
end

select * from #dates order by 1

drop table #dates
drop table dates

set nocount off
...
Рейтинг: 0 / 0
04.12.2001, 17:20
    #32018435
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
В общем случае дата может отсутствовать или присутствовать по разным причинам. Если анализ этих причин не требуется, то все выше сказанное имеет смысл. Если же требуется отделить выходы на работу во внеурочное время (по выходным и праздникам) от выходов на работу по субботам и воскресеньям, на которые официально были перенесены отработки присоединенных к праздикам дней... Либо если требуется отделить невыход на работу по причине прогула от невыхода на работу в промежутке понедельник-пятница по причине праздника...
... То я в таких случаях завожу пару таблиц исключений из общего правила. В одной я коллекционирую субботы и воскресения, которые официально являются рабочими. В другую я заношу понедельники-пятницы, которые официально являются праздничными (не рабочими). Для полной картины можно еще завести таблицу с сокращенными рабочими днями.
Лично мне сокращенные рабочие дни не нужны. Я использую только две таблицы исключений, и с их помощью могу расчитать количество банковских дней между двумя любыми датами. не знаю, какая задача стоит у тебя.
...
Рейтинг: 0 / 0
05.12.2001, 10:48
    #32018477
Timur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста, составить запрос!!! :0(
2 Gary
Вы поделились со мной очень полезной информацией. Спасибо. Буду использовать.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста, составить запрос!!! :0( / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]