ПредишенСледващото

Глава 4. време типове данни в стандарта SQL

4.1. Съвети за работа с дати, часове, както и времеви отпечатъци

Синтаксисът и възможна дата, клеймото (клеймото) време и така зависи от конкретното изпълнение, че само общи съвети може да се предложи. Тази глава се приема, че вашата SQL изпълнение поддържа само най-простата аритметика дата, но може би ще намерите библиотека функция, която може да си свършат работата по-ефективно. Преди пълното прилагане на стандарта SQL-92 за повече подробности вижте инструкциите за експлоатация на вашия продукт.

4.1.1. Стандарти формат на дата

4.1.2. Работа с дата и час

4.1.3. в крайна сметка работи

4.2. Заявки, съдържащи датата

Почти всички от изпълнението на SQL тип DATE данни съдържа, но тяхната функция във всеки един случай е малко по-различна. Най-честата характеристика - конструктор, който строи датата на базата на числа и низове; функционални абсорбатори извличат месеца, деня или година; Други характеристики позволяват да форматирате изхода.
Можете да очаквате, че вашата SQL за изпълнение включва прости дата функции, въпреки че техният синтаксис май до известна степен зависи от продукта. Тези функции са:
1. Дата, плюс или минус броя на дните, води до по-нова дата.
2. Дата минус Втората дата резултатите в цял брой дни.
Обърнете внимание на списъка на допустимите комбинации от типове данни и в стандартен SQL-92.

Има и други правила, свързани с часовата зона и определяне на относителната точност на двете операнди, те са доста очевидно.
Във всеки изпълнение следва да е функция, която връща текущата дата въз основа на системния часовник. Името на тази функция зависи от изпълнението - тя може да бъде ДНЕС, SYSDATE, текущата дата, getdate () и т.н. Възможно е също функция, която връща ден от седмицата на базата на датата, понякога се нарича DOW () или WEEKDAY () .. В SQL-92 стандарт са CURRENT_DATE функция, CURRENT_TIME [(

4.3. лични календари

Сега ние трябва да създадете таблица с датите на сделките и плащанията за цялата година. INSERT INTO изявления за зареждане на втората таблица може да се настрои с помощта на електронни таблици; Те винаги съдържат удобни дата функции.
Обърнете внимание на някои функции на календара. Ако празниците не са към датата на сделките и плащанията винаги ще бъдат разделени един от друг в продължение на три дни (CURRENT_DATE + ИНТЕРВАЛ 3 дни). Можете да създадете таблица с две колони, така че датите на сделките ще бъдат в един от тях, а в други - (tradedate + 3 дни). След това запазете електронната таблица в ASCII формат и товар в таблица на база данни с следното определение:

Сега на масата е пълна, тъй като, ако празнични и почивни дни не е бил. Ъпгрейд на заплащане дни са зададени правилно. Да започнем със събитията от списъка:

Такъв код се движи от датата на плащане за предстоящия ден, ако тази празнина се случва почивка. Например, ако на почивка се пада в петък, след датата ще бъде преместен в събота. Сега трябва да се прехвърли съответната дата с почивните дни за понеделник:

Повторете тези три актуализации, докато не получите съобщение система, която е модифицирана нулеви записи. Това е важно; например, представете си ситуация, в която един уикенд с празника продължи в продължение на четири дни. В този случай, петък отложено за събота, събота и неделя до понеделник и понеделник до вторник. От понеделник - почивка, назначаването му също пренесе върху вторник. Така че, за да се осигури на всички дати в правилната позиция, че е необходимо да се направи на втория тур на актуализации.
Ако желаете да се съкрати на масата, моля, имайте предвид, че всички дати на транзакции следва да попадат в делнични дни, а не в събота и неделя. Това намалява масата готов за приблизително 100 линии (52 изходящи х 2 дни):

За да разберете защо датата е преместен, е необходимо да се чете имената и датите на уикенда в искането:

Финалната маса ще съдържа около 250 линии и само две колони. Той е много малък и лесен за да се побере в почти всеки компютър, диск. Търсене заплата прави с една единствена заявка; ако сте задали само празниците на масата, вие ще трябва да напишете процедурен правилник.

4.4. времеви редове

Един от основните проблеми, свързани с необходимостта от обработка на последователността от събития, настъпили в същия период от време, или в определен ред. за този код е доста сложно и трудно за разбиране; Основната идея е, че имате една маса с начален и краен час на събитието, и искате да получите информация за тях като група.

4.4.1. Пропуските във времето серия

време Line може да бъде разделена на интервали от време, а след това на изхода на един отчетен групови такива интервали. Например, един от основните проблеми при наемането е да поиска от заявителя да обяснят причините за пропуски в неговия трудов стаж. Като правило, такива пропуски означава, че лицето не е работило (понякога се нарича "бил консултант" - синоним на безработните).
Ние се изгради SQL заявката за който показва продължителността на периодите на заетост (безработица) за кандидатите. Предполага се, че внедряването съдържа SQL функции на датата, способни да изпълнят прости математически операции с календара.

Имайте предвид, че крайната дата за текущото задание трябва да се настрои на някаква далечна време или можете да премахнете ограничението NOT NULL и използвайте нула стойности. Стандартът SQL не поддържа ценности като "вечност", или в края на времето "(вечност или краен час). Най-големият представена в SQL данни - за "9999-12-31 23:59" 59.999999 ", и неговата употреба.
Очевидно е, че такова искане трябва да съдържа с масата на съединението, но е необходимо да се използва също и някои аритметични дата, за да се отрази фактът, че в първия ден от всеки период на празен ход е последният ден на предходния зает период плюс един, а в последния ден на празен ход период е първият ден от следните дестинация минус 1. началото и края на деня, обяснява проблема в SQL предикат припокривания.
Повечето от версии на SQL поддържа актуална и стандарта SQL-92, има определение на дати и видове аритметични операции за работа с тях. За съжаление, във всички приложения на тези видове са представени по различен начин, и няма нищо като единен стандарт ANSI. Този пример ще използваме добре за четене, но нестандартни нотацията, вие ще бъдете в състояние да бъдат преведени на езика на вашия продукт.
Първият опит да се създаде желаната заявка обикновено води до нещо подобно на по-долу обява. Тази заявка произвежда правилните резултати, но също така и някои допълнителни нежелани линии. Предполага се, че чрез добавяне на определен брой дни с дата, или да ги извади, ще получите нова дата.

Това искане не е подходящо поради следната причина. Да предположим, че в моята маса съдържа името на кандидата Бил Джоунс и историята на работата си:

Качваме се на резултата:

Низ с името на Джон Смит изглежда доста добре, а може би си мислите, че с останалите играчи на масата е добре. Той работи на две места и по този начин трябва да има период на безработица. Въпреки това, низ Бил Джоунс не може да е вярно - неговият срок три работни места, трябва да се разделят на два периода на безработица. Въпреки това, по искане извежда три такъв интервал.
Заявка за свързване се отнася за всички възможни комбинации на начална и крайна дата на първоначалната таблица. Има неверни данни, тъй като в края на натоварения период ( "сган Worker") и началото на друг (голям Poobah ") той счита като период на престой. Ние също трябва да се вземат под внимание само последната завършена работа. Това може да стане с помощта на функцията за MAX () и друга свързана подзаявка. Крайният резултат е:

4.4.2. Непрекъснати периоди от време

Ако кандидатът е представил списък на строителни работи, в началото и в края на който се пада в различно време, е необходимо да се проследи дали цялото това време той е работил без прекъсване. Конструкция за маса служител на заетостта:

Ние трябва да създадем условия за търсене за всички характеристики на продължителен период от време.

Въпреки това, можете да създадете заявка, която показва също натоварени периоди, ограничаващи непрекъснат период:

Ако работите с база данни Sybase SQL Anywhere, това искане може да бъде променен, за да се включи низ (виж подробности 21.5 см.) Агрегат списъка () функцията.

СПИСЪК () функция извършва автоматично сортиране. Имайте предвид, че на последния ред на резултата всъщност е подмножество на предпоследния ред. Ако ще да спаси отговора в таблицата, всички такива подгрупи могат да бъдат отстранени с функция низ ПОЗИЦИЯ ().

Използването на тази процедура до момента е приемливо, макар и малко по-трудно.

4.4.3. Локализация на датите

Първият подход за решаване на проблема - използвайте фрагменти от компонентите на дата в условията на търсене. Например, за да можете да намерите най-рождените дни на всички служители в същия месец:

Въпреки това, е опит да се разшири този подход няма да работи, тъй като периодът от време 45-дневно може да има три месеца и може да преминете към следващата година, който може да бъде високосна година. Много скоро, броят на обажданията на функцията ще се увеличи значително, а логиката е малко сложно.
Вторият подход - напишете проста дума за търсене с тези функции и дизайн, с помощта на рождени дни и през текущата година, считано от датата на раждане (DOB) Служител на маса:

Преведено на обикновен език израз означава: ако един служител става година по-голям от 45 дни, си рожден ден е в даден период от време.

4.4.4. Първите и последните дни на месеца

Дати могат да бъдат включени в базата данни по различни начини. Дизайнерите могат да изберат един продукт формат като Cobol език, където годината, месеца и деня, като е отделена площ за всяка дата. Друг продукт може да се използва UNIX стил, където датата се определя като компенсация от някои първоначални точка, изразена в единици за някои малки час и дата на дисплея формат се изчислява, когато е необходимо. Форматът стандарт за съхранение на SQL-92 не е описан, но "подход Cobol" по-лесно да се покаже на екрана, и "подход компенсира" е по-лесно да се извърши изчислението.
Резултатът е, че идеалният метод за изчисляване на първия или последния ден от месеца от датата не съществува. Методът на Cobol могат да получат на първия ден от месеца, да конвертирате дата, така че в деня, сложи номер 1.

Последен ден на месеца, за да се получи малко по-трудно. Методът на Cobol обикновено е функция, която изгражда датата на числовите полета на годината, месеца и деня. Може да си мислите, че с построяването на първия ден от следващия месец и изваждане от него един ден можете да получите желания:

Тя работи бързо с продукти, които се прилагат към метод дати изместване. Общо под-израз, както и израз INTERVAL оценява само по веднъж. Всичко останало - е аритметика с числа. Първият ден е много лесно да се изчисли:

Не забравяйте, че разделението е цяло число, тъй като променливите, които участват в него са неразделна тип. Обърнете внимание на друга версия на алгоритъма, който изпълнява същите изчисления:

Тази програма се основава на предположението, че хвърли функция (х в цели) пресечен х, докато това не стане кръг; проверка на документацията на SQL процесор.
По-долу е написано в процедура Pascal за конвертиране на григорианския датира Юлиан, тя е взета от книгата Числени Рецепти в Паскал (Press, Фланъри и Vetterling, 1989).

За да се превърне юлианския към григорианския дата, направете следното:

С тези алгоритми са два проблема. На първо място, астрономите започват да Юлиан ден по обяд. Ако мислите, че това има смисъл, защото те изпълняват своята работа най-вече през нощта. Вторият проблем с големи размери, включени в изчисленията на числа; че няма да бъде в състояние да ги замени с число с плаваща точка, тъй като това значително увеличава грешката при закръгляването. Освен това, имате нужда от броя на вид дълго цяло число (дълги цели числа), защото им гама обхваща 2,5 милиона ценности.

4.6. Функции на датата и часа на екстракция

На разположение за работа с типове данни функции , всеки продукт е различен. SQL3 оферта включва екстракция функция вариант компонент на стойност дата време и интервала (тази функция е вероятно да бъде претоварен на различни продукти). Синтаксисът е:

Очевидно е, че този метод може да бъде приложен и в други низови функции, които ви позволяват да търсите дата или час фрагменти, периоди от време и т.н.
Препоръчително е да прочетете ръководството за използване на вашия продукт SQL и неговото описание на функциите, за да търсят своите библиотечни функции.

4.7. Други характеристики на работа с дати и часове

Налице е много широко разпространена група от функции, които не са предвидени в стандарта SQL. Тази функция работи с по седмици. Например, SQL Anywhere Sybase компания (по-рано Watcom SQL) съдържа функция DOW () Връща число от 1 до 7, съответстващ на деня от седмицата (в съответствие с ISO споразумение 1 = неделя, 2 = понеделник. 7 = събота). Можете също така да намерите елементи, които се добавят или изваждат от датата на седмицата, обособяването седмица на годината, и т.н. Функцията за търсене на съответната дата на деня от седмицата, се нарича алгоритъм Zeller:

DB2 и XDB SQL продукти съдържат AGE функция (, ), Който се връща разликата във възрастта между датите и .
В таблицата в раздел 10.1 обобщава всички валидни аритметични оператори в SQL-92, включително типове данни и . Тези операции са обект на природни правила, свързани с дати и часове, както и да предоставят резултатите от същия тип в зависимост от календара на нова ера.
операции тип данни Тя изисква, че те взаимно да се сравним. За операциите тип данни необходимо, че са взаимно сравними.
с видовете операции и бди операнди пъти . Ако тя не съдържа никаква индикация за часовата зона, се използва местно време.
Предикатна припокрива определя дали две хронологичен припокриване в интервал от време (подробности, описани в раздел 13.2). Последното се определя или от двойка стойности на типа (Начална и крайна) или началната стойност и стойност на типа .
ЕКСТРАКТ функция ( ОТ Тя получава тип данни или и връща текущия числената стойност, представляваща стойността на един компонент от влезе.

Вторият проблем може да е шокиращо. Както ни учеха в училище, в годината 365,25 дни и натрупването на дробни части на ден води до високосна година на всеки четири години. Учител излъга - една година всъщност е 365.2422; натрупване, на всеки 400 години, тази разлика дава още един ден. Тъй като повечето от нас не разполагат с 400 години, ние не трябваше да се тревожи за това. На езика на SQL / PSM правилно проверка на високосна година е както следва:

А по-компактно решение бе предложено от Александър Фил; тя може да бъде включена в вграденият код като израз за търсене на:

4.8.4 Фатална дата на наследството данни

Свързани статии

Подкрепете проекта - споделете линка, благодаря!