Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Служба Рассылок Subscribe.Ru

Выпуск №071 рассылки "MS SQL Server - дело тонкое"
#070<<  #071

СОВЕТЫ

Вычисление количества рабочих дней
По материалам статьи Steve Jones на sqlservercentral.com: " How Many Business Days Are There?"

Недавно, в конференции мне попался на глаза запрос, исполнение которого создавало проблемы для приложения потому, что он искал агрегаты и затем объединял их со статическими значениями, чтобы определить число рабочих дней между двумя датами. Мое предложение состояло в том, что бы расщепить запрос на несколько частей. Это побудило меня заинтересоваться проблемой того, как Вы вычисляете число рабочих дней между двумя датами. Большое количество людей использует это при вычислении дат оплаты, отгрузки или для простого планирования. В США приняты пять стандартных рабочих дней каждую неделю (понедельник, вторник, среда, четверг, и пятница). Суббота и воскресенье обычно не рабочие дни. Это не всегда истина, некоторые компании используют шестидневный цикл, но для моего примера я ограничусь 5 днями. SQL Server имеет несколько функций дат, но ни одна из них не умеет непосредственно определять число рабочих дней. Так, как же Вы сможете сделать это?
Я разработал собственный алгоритм, так как это походит на простое вычисление. Вот - алгоритм (реализованный как функция) с описанием, что делается:


if object_id('fBusinessDays') Is not null
drop function fbusinessdays
go
create function fBusinessDays (@start datetime, @end datetime)
returns int
as
begin
/*
Description:
Function designed to calculate the number of business days
between two dates.
*/
declare
@wks int
,@days int
,@sdays int
,@edays int

-- Find the number of weeks between the dates. Subtract 1
-- since we do not want to count the current week.
select @wks = datediff( week, @start, @end) - 1
-- calculate the number of days in these full wks.
select @days = @wks * 5
-- Get the number of days in the week of the start date. This is the days
-- between Saturday (datepart=7) and the startdate. We also remove the
-- Sunday (datepart=1). If the first day is a Saturday, do not exclude
-- this twice.
if datepart( dw, @start) = 7
select @sdays = 7 - datepart( dw, @start)
else
select @sdays = 7 - datepart( dw, @start) - 1
-- Calculate the days in the last week. These are not included in the
-- week calculation. Since we are starting with the end date, we only
-- remove the Sunday (datepart=1) from the number of days. If the end
-- date is Saturday, correct for this.
if datepart( dw, @end) = 7
select @edays = datepart( dw, @end) - 2
else
select @edays = datepart( dw, @end) - 1

-- Sum everything together.
select @days = @days + @sdays + @edays
return( @days)
end

Я преднамеренно разбил эту функцию на шаги, чтобы сделать её проще в понимании. Вы можете объединить некоторые из шагов в меньшее количество строк, но я исходил из простоты понимания алгоритма.
Для разработки алгоритма, я запустил наиболее очевидный для меня инструмент: календарь. После этого, я беспорядочно выбирал некоторые даты и считал число рабочих дней между ними. Как только я завершил этот шаг, я принялся искать образцы. Из BOL я знал, что в моём распоряжении имеются функции DATEPART и DATEDIFF. Первое, что я заметил для всех дат, которые я выбирал, было то, что я мог сосчитать число недель между двумя датами и получить грубую оценку числа дней между ними, простым умножением на 7. С недавних пор, T-SQL имеет удобную функцию DATEDIFF, которая может вычислить это, что делало её хорошим кандидатом. Вычисление было такое:
   number of weeks * 7 = estimate of days
Однако, нам не нужны просто дни, нам нужны рабочие дни. Так как есть пять рабочих дней в неделю, я уменьшил число дней с 7 до 5. Другой момент, который я заметил в этом вычислении - это то, что одна неделя бывает не полная. Поэтому я решил уменьшать число недель на одну и вычислять дни на последней неделе отдельно. Первая часть функции реализует этот шаг. Далее, я вычислял число рабочих дней в последней неделе и по аналогии в первой неделе. Также, учитываются субботы и воскресенья.
Представленный Вам пример не может быть лучшим решением, но это работает хорошо и показывает, как хорошая практика программирования (encalsulation) может использоваться в функциях SQL Server 2000. Альтернативно, Вы можете сделать хранимую процедуру для SQL Server 7 или 6.5 и хранить результат в переменной.

ССЫЛКИ НА СТАТЬИ

Динамическое создание ДТС-пакетов с помощью VB 
Автор: Андрей Чувахин.
Почти все разработчики в области DBA (Database Access) рано или поздно сталкиваются с проблемой перемещения данных между базами данных, с которыми работают их приложения. В моей статье я продемонстрирую программное решение конкретной задачи по копированию данных из таблицы формата ДБФ в базу данных MS SQL Server. Сразу оговорюсь, что мое решение не претендует на идеальность, поэтому прошу помидорами не закидывать. Итак, передо мной стояла задача: нужно из какой-то точки локальной сети доступной серверной машине переместить данные, которые находятся в таблице формата ДБФ в базу данных MS SQL Server, причем база данных на сервере - произвольная, сервер тоже....[подробнее] 
Crystal Analysis 8 Professional: поддерживаемые платформы 
Автор: Interface Ltd..
Поддерживаемые клиентские платформы...[подробнее] 
Создание и заполнение хранилищ данных с помощью Data Transformation Services 
Автор: Алексей Федоров, Наталия Елманова.
Прежде чем обсуждать создание OLAP-кубов, вспомним, что, как правило, исходные данные для их создания хранятся не в оперативной базе данных, с которой работают пользователи, а в специализированном хранилище данных. Настоящая статья будет посвящена вопросам заполнения хранилищ данных и синхронизации их с содержимым оперативной базы данных...[подробнее] 
BrightStor ARCserve - новое средство резервного копирования от Computer Associates 
Автор: Interface Ltd..
24 октября прошла конференция Data Security Day, на которой была представлена новая версия продукта ARCserve - BrightStor ARCserve Enterprise Backup...[подробнее] 
Билл Гейтс подробно расписал будущее Microsoft .Net 
Автор: Cnews и CPS News.
Microsoft объявила четыре спецификации новой "Глобальной XML-архитектуры веб-сервисов" - WS-Security, WS-License, WS-Routing и WS-Referral - безопасность, лицензирование, маршрутизация и направление соответственно. Спецификации построены на базе XML и SOAP (Simple Object Access Protocol - протокол доступа к простым объектам). WS-Security описывает пути использования существующих спецификаций W3C XML Signature и XML Encryption. Она связана с WS-License. WS-Routing, ранее известная как SOAP-RP, описывает способы адресации информации, а WS-Referral позволяет осуществлять динамическое перенаправление трафика сетевых систем, использующих SOAP...[подробнее] 
Структуризированный язык запросов (SQL) 
Автор: Interface Ltd..
В книгу включены наиболее важные предложения базового варианта SQL, позволяющие познакомиться с основными средствами манипулирования данными. Недостаток места не позволил подробно рассмотреть другие его конструкции. Однако и таких знаний достаточно для получения данных из баз, находящихся под управлением большинства современных СУБД...[подробнее] 

Новые технические статьи Microsoft

1 BUG: AutoClose Database Option May Cause a Stack Dump and Cause SQL Server to Shut Down (Q309255)
2 FIX: Open of DTS Package Fails with Type Mismatch Error Message (Q310473)
3 PRB: Poor Performance on a Heap (Q297861)
4 INF: List of Version Numbers of ODBC Driver Manager and SQL Server (Q171221)
5 BUG: ATL OLE DB Provider Fails When Called from SQL 7.0 Query (Q198520)
6 INFO: Microsoft Data Access Components (MDAC) Release History (Q231943)
7 INF: How to Establish Encrypted Multiprotocol Connections with SQL 7.0 (Q239894)
8 FIX: "Incorrect Syntax near the Keyword 'by' " Error Message with Column Names of "C", "CA" or "CAS" (Q273813)
9 FIX: SQL Server ODBC Driver Reuses Incorrect Parameter Length (Q280294)
10 FIX: Buffer Overflow Exploit Possible with Extended Stored Procedures (Q280380)
11 FIX: SQLDescribeParam Causes Syntax Error or Access Violation (Q293790)
12 FIX: Unhandled Exception Error Querying with the Data Mining Provider from ADO+ and C# (Q297728)
13 HOW TO: Implement Forms-Based Authentication in Your ASP.NET Application Using C# .NET (Q301240)
14 HOW TO: Use XML in Connected and Disconnected ADO.NET Applications (Q307224)
15 HOW TO: Implement Forms-Based Authentication in Your ASP.NET Application Using Visual Basic .NET (Q308157)
16 FIX: SQLPutData May Result in Leak of Buffer Pool Memory (Q307540)
17 FIX: Use of a Dynamic API Server Cursor with a NOLOCK Hint Causes Error 1047 (Q310935)
18 PRB: SQLServerAgent Service May Stop Responding (hang) After You Restart the Computer (Q306655)
19 BUG: SQL Profiler Trace Has Extraneous Values in Mode Column (Q308715)
20 FIX: ODBC Functions TIMESTAMPADD and TIMESTAMPDIFF May Cause Error 128 (Q311000)
21 Support WebCast: New Features in XML for Microsoft SQL Server 2000 Web Release 2
22 BUG: DTSRUN Fails with Errors If the Arguments Have Multiple Space Characters Between Them (Q308801)
23 PRB: User Logon and/or Permission Errors After Restoring Dump (Q168001)
24 INF: Reset Proxy and the SQLAgentCmdExec Account (Q264155)
25 FIX: Immediate Updating Subscribers Receive Error Message 7415 When Performing UPDATES and INSERTS (Q264170)
26 PRB: "Troubleshooting Orphaned Users" Topic in Books Online is Incomplete (Q274188)
27 FIX: SP2 Regression: Running a Stored Procedure with Index on Local Temp Table Causes AV (Q276499)
28 FIX: Assert Occurs When You Try to Alter a Database and Trace Flag 902 is Enabled (Q290080)
29 FIX: Extended Stored Procedure "xp_logevent" Generates an Access Violation When Given Too Large a Parameter (Q290085)
30 FIX: Unicode Character String Longer Than Seven Bytes in a LIKE Clause Is Truncated in Execution Plan (Q292637)
31 BUG: Database Restore May Result in DBO Mismatch if DBO Has Been Changed More Than Once (Q296437)
32 FIX: SQL Server Performance Condition Alerts do not Fire After You Install SQL Server 2000 Service Pack 1 (Q303005)
33 PRB: SQL Virtual Cluster Server Fails to Bind to the Port on Which it is Listening (Q307197)

ФОРУМ SQL.RU: САМЫЕ ПОПУЛЯРНЫЕ ТОПИКИ НЕДЕЛИ

Refresh таблиц или аналог IBEvents для MSSQL
Эффективнось запуска SP из ADO
1C и MSSQL 2000
Помоему это неразрешимый вопрос :(((
Как организовать работу с табличной частью док-та, блокировки и все такое?
Выбор определенного кол-ва записей Select запросом
Как получить значение??
Как получить номер строки?
Как узнать последнюю дату обновления таблицы??
Запросы к linked server-у !?

ФОРУМ SQL.RU: ВОПРОСЫ ОСТАЛИСЬ БЕЗ ОТВЕТА

Проблема с кодировкой ??
Как лучше выбрать блокировку, правильно управлять транзакциями
Вопрос по перекодеровке. Interbase -> MS SQL
Ошибка 4510
БОСС-Кадровик
ANSI to OEM
ЖИЗНЬ ПОСЛЕ "FAILED CONNECTION" В ADP
DTS. ActiveX Script.
Клиентское приложение и OLAP Server

#070<<  #071

Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру на адрес: mssqlhelp@pisem.net

sql.ru

Описание рассылки
 Поиск на SQL.RU
Искать: 
Результатов на странице: Формат:
Тип запроса: Раздел:
МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное