Читать интересную книгу Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 31 32 33 34 35 36 37 38 39 ... 238

Распознаваемые форматы описаны в табл. 10.2.

Таблица 10.2. Распознаваемые форматы литералов даты и времени

Формат Диалект 3 DATE Диалект 3 TIMESTAMP DATE ' CCYY-MM-DD' или 'YY-MM-DD' Сохраняет только дату Сохраняет дату и время в виде 00:00:00 Сохраняет дату и время в.виде 00:00:00 'MM/DD/CCYY' или 'MM/DD/YY' То же То же То же 'DD.MM.CCYY' или 'DD.MM.YY' То же То же То же ' DD-MMM-CCYY' или 'DD-MMM-YY' То же То же То же 'DD,MMM,CCYY' или ' DD,MMM,YY' То же То же То же 'DD MMM CCYY' или 'DD MMM YY' To же То же То же 'DDMMMCCYY' или 'DDMMMYY' To же То же То же

В элементе MMM также допустимы полные английские названия месяцев, нечувствительные к регистру. Правильные названия приведены в табл. 10.3

'CCYY-MM-DD HH:NN:SS.nnnn' или 'YY-MM-DD HH:NN:SS.nnnn' (элемент ".nnnn" необязателен) Сохраняет только дату; может потребовать преобразования для даты. Время не сохраняется Сохраняет дату и время Сохраняет дату и время 'MM/DD/CCYYHH:NN:SS.nnnn' или 'MM/DD/YY HH:NN:SS.nnnn' То же То же То же ' DD.MM.CCYYHH:NN:SS.nnnn' или 'DD.MM.YY HH:NN:SS.nnnn' То же То же То же 'DD-MMM-CCYY HH:NN:SS.nnnn' или 'DD-MMMYY HH:NN:SS.nnnn' То же То же То же

Типы TIMESTAMP в диалекте 3 и DATE в диалекте 1 принимают дату и время в литерале даты. Литерал даты без времени будет сохранен и с временем в виде ' 00: 00: 00'.

Тип DATE в диалекте 3 принимает только дату. Тип данных TIME принимает только время.

"Скользящее окно века" в Firebird

Независимо от того, как представлена часть года в литерале DATE или TIMESTAMP, в виде CCYY или YY, Firebird всегда сохраняет полное значение года. Он обращается к алгоритму получения части cc (столетие). Он также всегда включает столетие при поиске типов даты. Клиентские приложения отвечают за отображение года в виде двух или четырех цифр.

Для получения столетия Firebird использует алгоритм скользящего окна. Задача заключается в интерпретации двухсимвольного значения года как ближайшего к текущему году в интервале предшествующих и последующих 50 лет.

Например, если текущий год 2004, то двухсимвольные значения года будут интерпретироваться, как показано в табл. 10.3.

Таблица 10.3. Определение года по двухсимвольному виду, если текущим является 2004 год

Двухсимвольный год

Полученный год

Рассчитывается как

98

1998

(2004 - 1998 = 6) < (2998 - 2004 = 94)

00

2000

(2004 - 2000 = 4) < (2100 - 2004 = 96)

45

2045

(2004 - 1945 = 55) > (2045 - 2004 = 41)

50

2050

(2004 - 1950 = 54) > (2050 - 2004 = 46)

54

1954

(2004 - 1954 = 50) = (2054 - 2004 = 50)*

55

1955

(2004 - 1955 = 49) < (2055 - 2004 = 51)

* Кажущееся равенство в этом сравнении может ввести в заблуждение. 1954 год ближе к 2004, чем 2054, потому что все даты между 1954 и 1955 годами ближе к 2004, чем все даты между 2054 и 2055 годами.

Разделители в неамериканских датах

Ничто не вызывает больше затруднений для интернациональных пользователей, как ограничения в Firebird на использование наклонной черты (/) только для американского формата 'MM/DD/CCYY'. Хотя почти все другие страны используют формат 'DD/MM/CCYY', Firebird будет либо записывать неправильную дату, либо вызовет исключение для литерала даты, использующего соглашение 'DD/MM/CCYY'.

Например, литерал даты '12/01/2004' всегда будет сохраняться в смысле "1 декабря 2004 года", а '14/01/2004' вызовет исключение выхода за границы диапазона, потому что не существует месяца 14. Однако допускается 'CCYY/MM/DD': дата '2004/12/31' будет расшифровано как "31 декабря 2004 года".

Обратите внимание, что Firebird не учитывает локальные форматы даты Windows или Linux при интерпретации литералов даты (ни на сервере, ни на клиенте). Его интерпретация числовых форматов дат основывается на символе-разделителе. Если точка (.) используется в качестве разделителя, Firebird интерпретирует дату в виде неамериканской нотации DD.MM, в то время как любой другой разделитель предполагает американскую нотацию MM/DD. Чтобы убрать американскую интерпретацию даты, ваши приложения должны преобразовать введенную дату DD/MM/CCYY в литерал, где наклонная черта заменена на символ точки в качестве разделителя. Дата 'DD.MM.CCYY' правильная. Могут быть использованы и другие форматы литералов даты.

Пробелы в литералах даты

Пробелы или символы табуляции могут присутствовать между элементами. Дата должна быть отделена от времени, по меньшей мере, одним пробелом.

Заключение в апострофы литералов даты

Литералы даты должны быть заключены в апострофы (ASCII 39). Допустимы только апострофы, а не двойные кавычки.

Литералы месяца

В табл. 10.4 показаны литералы месяцев.

Таблица 10.4. Литералы месяцев и правильное английское написание

Число

Аббревиатура (не чувствительно к регистру)

Полное название месяца (не чувствительно к регистру)

01

JAN

January

02

FEB

February

03

MAR

March

04

APR

April

05

MAY

May

06

JUN

June

07

JUL

July

08

AUG

August

09

SEP

September

10

OCT

October

11

NOV

November

12

DEC

December

Примеры литералов даты

Двадцать пятое число (25) шестого месяца (июнь) 2004 года может быть представлено любым из следующих способов:

'25.6.2004' '06/25/2004' 'June 25, 2004'

'25.jun.2004' '6,25,2004' '25,jun,2004'

'25jun2004' '6-25-04' 'Jun 25 04'

'25 jun 2004' '2004 June 25' '20040625'

'25-jun-2004' '2004-jun-25' '20040625'

'25 JUN 04' '2004-06-25' '2004,25,06'

Предварительно определенные литералы даты

Firebird поддерживает группу "предопределенных" литералов дат - английские слова, заключенные в апострофы, которые Firebird выбирает или вычисляет и интерпретирует в контексте соответствующего типа даты/времени. Слова 'TODAY', 'NOW, 'YESTERDAY' и 'TOMORRROW интерпретируются, как показано в табл. 10.5.

Таблица 10.5. Предварительно определенные литералы даты

Литерал

Тип диалекта 3

Тип диалекта 1

Значение

'NOW'

TIMESTAMP

DATE

Дата и время сервера, которые были текущими на момент старта операции DML. 'NOW' будет преобразовано и корректно сохранено в полях DATE, TIME и TIMESTAMP В диалекте 3 или в полях DATE в диалекте 1. Как и эквивалентная контекстная переменная CURRENT_TIMESTAMP, значение всегда сохраняется с долями секунды ' .0000' *

' TODAY'

DATE

DATE хранится с временем равным '00:00:00'

Дата и время сервера, которые были текущими на момент старта операции. Если в процессе операции миновала полночь, дата не изменяется. Эквивалентен контекстной переменной диалекта 3 CURRENT_DATE. Недопустим для полей типа TIME

'TOMORRROW'

DATE

DATE хранится с временем равным '00:00:00'

Дата и время сервера, которые были текущими на момент старта операции, плюс 1 день. Если в процессе операции миновала полночь, дата, из которой была вычислена дата 'TOMORRROW', не изменяется. Недопустим для полей типа TIME

'YESTERDAY'

DATE

DATE хранится с временем равным '00:00:00'

Дата и время сервера, которые были текущими на момент старта операции, минус 1 день. Если в процессе операции миновала полночь, дата, из которой была вычислена дата 'YESTERDAY', не изменяется. Недопустим для полей типа TIME

* Тем не менее ничто не теряется. Вы можете получить дату и время сервера с десятитысячными долями секунды, используя UDF GetExactTimestamp (...) из библиотеки UDF Firebird. Более подробную информацию см. в приложении 1.

Неявное преобразование типов в литералах даты и времени

Когда литералы даты - неважно, обычные или предварительно определенные - используются в SQL в контексте с соответствующим типом даты/времени столбца или переменной, синтаксический анализатор SQL может корректно их интерпретировать без преобразования. При этом в небольшом количестве случаев, когда не существует типизированного значения, которому синтаксический анализатор мог бы присвоить литерал даты, он трактует любой литерал даты как строку.

Например, совершенно верным является затребовать, чтобы запрос SELECT вернул константу, которая не связана ни с каким столбцом в базе данных. Основное "хакерство" в Firebird- использование системной таблицы RDB$DATABASE в запросе, поскольку эта таблица имеет одну и только одну строку, и всегда можно получить скалярное значение: единственное контекстное значение от сервера. Следующие два примера иллюстрируют типичное использование этого приема:

1 ... 31 32 33 34 35 36 37 38 39 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Оставить комментарий