Страница 1 из 3

Date 2 Integer

Добавлено: 14 фев 2008, 14:12
avenger
Привет Всем! Есть какой способ сделать преобразование Date->Integer?

P/S/ Придумал пока 2-а способа: UDF, SQL: Количество дней * 24.

Есть еще варианты?

Re: Date 2 Integer

Добавлено: 14 фев 2008, 14:21
stix-s
avenger писал(а):Привет Всем! Есть какой способ сделать преобразование Date->Integer?

P/S/ Придумал пока 2-а способа: UDF, SQL: Количество дней * 24.

Есть еще варианты?
а в чем глубокий смысл?

Re: Date 2 Integer

Добавлено: 14 фев 2008, 14:31
avenger
stix-s писал(а):а в чем глубокий смысл?
Есть подозрение, что

Код: Выделить всё

SELECT CAST(CAST('2007-09-20' AS DATE) AS VARCHAR(10)) FROM RDB$DATABASE
на разных серверах выглядет по разному. Например 2007-09-20 или 20-SEP-200. А Integer выглядет везде одинаково.

Хочется репликацию не родного мне проекта усовершенствовать. Там в качестве ключевых полей используется тип Date.

Re: Date 2 Integer

Добавлено: 14 фев 2008, 14:44
stix-s
avenger писал(а):
stix-s писал(а):а в чем глубокий смысл?
Есть подозрение, что

Код: Выделить всё

SELECT CAST(CAST('2007-09-20' AS DATE) AS VARCHAR(10)) FROM RDB$DATABASE
на разных серверах выглядет по разному. Например 2007-09-20 или 20-SEP-200. А Integer выглядет везде одинаково.

Хочется репликацию не родного мне проекта усовершенствовать. Там в качестве ключевых полей используется тип Date.
Вообще-то формат отображаемой даты ИМХО в региональных настройках, а не в сервере зашит.

Re: Date 2 Integer

Добавлено: 14 фев 2008, 14:50
hvlad
stix-s писал(а):
avenger писал(а):
stix-s писал(а):а в чем глубокий смысл?
Есть подозрение, что

Код: Выделить всё

SELECT CAST(CAST('2007-09-20' AS DATE) AS VARCHAR(10)) FROM RDB$DATABASE
на разных серверах выглядет по разному. Например 2007-09-20 или 20-SEP-200. А Integer выглядет везде одинаково.

Хочется репликацию не родного мне проекта усовершенствовать. Там в качестве ключевых полей используется тип Date.
Вообще-то формат отображаемой даты ИМХО в региональных настройках, а не в сервере зашит.
У него - варчар.

См. диалекты

Re: Date 2 Integer

Добавлено: 14 фев 2008, 14:57
avenger
hvlad писал(а):У него - варчар. См. диалекты
И толку, в одном месте так в другом так. Может есть простой способ сделать так cast(date as integer)?

Re: Date 2 Integer

Добавлено: 14 фев 2008, 15:05
hvlad
avenger писал(а):
hvlad писал(а):У него - варчар. См. диалекты
И толку, в одном месте так в другом так.
Это ты мне про толк рассказываешь ? У тебя одна БД в 1-ом диалекте, а другая - в 3-ем - "и толку" ? Пореплицируй их, ага, особенно bigint'ы
avenger писал(а):Может есть простой способ сделать так cast(date as integer)?
Есть. Но я не скажу. Т.к. оно тебе не надо для озвученной задачи

Re: Date 2 Integer

Добавлено: 14 фев 2008, 15:18
avenger
hvlad писал(а): Это ты мне про толк рассказываешь ? У тебя одна БД в 1-ом диалекте, а другая - в 3-ем - "и толку" ? Пореплицируй их, ага, особенно bigint'ы
Обе базы в 3-ем диалекте, версии разные fb2 и fb1.5

Почему не скажешь?

Re: Date 2 Integer

Добавлено: 14 фев 2008, 16:18
hvlad
avenger писал(а):Обе базы в 3-ем диалекте, версии разные fb2 и fb1.5
Нет, не в 3-ем.
avenger писал(а):Почему не скажешь?
См. выше

PS Сегодня развлечение на sql.ru, не нужно тут тоже цирк устраивать

Добавлено: 14 фев 2008, 16:40
kdv
Обе базы в 3-ем диалекте, версии разные fb2 и fb1.5
2007-09-20 или 20-SEP-2007
звездеж. первый вариант это 3-ий диалект, второй вариант - 1й диалект.
В любых версиях IB/FB которые поддерживают и первый и третий диалект, будет одинаково.

Добавлено: 14 фев 2008, 17:21
Merlin
Базы-то может и в третьем, а один из коннектов в первом.

Добавлено: 14 фев 2008, 17:46
kdv
а один из коннектов в первом.
ну так нефиг :)

Добавлено: 14 фев 2008, 19:41
WildSery
Помнится, на скруле был спор по поводу точки отсчёта, что именно считать "нулём".
Вот это действительно на каждом сервере и программе - кто в лес, кто по дрова. И нифига int не будет универсальным поэтому.

А дата - она и есть дата. Форматируй UDF-кой, если унификацию хочешь в строке. А лучше клиент пусть процессор морщит, как тебе её показать.

Добавлено: 14 фев 2008, 19:56
Merlin
WildSery писал(а): А лучше клиент пусть процессор морщит, как тебе её показать.
Ай, Серёжа, ну кто нынче прграммает на этой отсталой технологии - клиент-сервер. Нынче и репликация и показывание - всё делается в SP через ES, какой ещё клиент :wink:

Добавлено: 14 фев 2008, 20:58
Kotъ-Begemotъ
WildSery писал(а):Помнится, на скруле был спор по поводу точки отсчёта, что именно считать "нулём".
Вот это действительно на каждом сервере и программе - кто в лес, кто по дрова. И нифига int не будет универсальным поэтому.

А дата - она и есть дата. Форматируй UDF-кой, если унификацию хочешь в строке. А лучше клиент пусть процессор морщит, как тебе её показать.
Ну, если вопрос совместимости, можно хранить разницу между жёстко заданной датой (01.01.1900 00:00:00) скажем и нужной датой... Хоть в миллисекундах :))) Нафига только?

Добавлено: 14 фев 2008, 22:12
Attid
ну вот самое интересное пропустил
Есть подозрение, что на разных серверах выглядет по разному. Например 2007-09-20 или 20-SEP-200.
это только на разных настройках компонент по разному выглядеть будет =) а серверам то вообще по барабану будет (в одном диалекте).

Добавлено: 14 фев 2008, 23:46
avenger
kdv писал(а):первый вариант это 3-ий диалект, второй вариант - 1й диалект.
Да действительно первый диалект. Просто первую попавшуюся под руку базу взял employee.fdb, а она в первом диалекте. Ну тогда проблема действительно надуманная, т.к. fb1.5 также в формате yyyy-mm-dd.

Добавлено: 14 фев 2008, 23:53
avenger
WildSery писал(а): Форматируй UDF-кой, если унификацию хочешь в строке. А лучше клиент пусть процессор морщит, как тебе её показать.
Я же сказал - это только для репликации. На мой взгляд PK типа 10/15/5684767 лучше чем такой 10/15/2007-10-01, т.к. дата представлена типом Integer.

Добавлено: 15 фев 2008, 00:04
avenger
Ну да, наверно проще всего преобразовать дату в integer - это найти РАЗНОСТЬ между данной датой и точкой отсчёта.

Типа Trunc(Date) = Date_Current - '1899-12-30'.

Добавлено: 15 фев 2008, 06:41
Kotъ-Begemotъ
avenger писал(а):Ну да, наверно проще всего преобразовать дату в integer - это найти РАЗНОСТЬ между данной датой и точкой отсчёта.

Типа Trunc(Date) = Date_Current - '1899-12-30'.
Тем более, что дата представлена целой частью Float значения а время - дробной, поэтому и с разницей работать просто. У меня есть кусок где просто тупо считается (Date2-Date1)*24*60*60 (это я развернул для лучшего понимания :) вот и разница в секундах, без всяких DecodeDate... Удобно. Прямо в запросе легко посчитать.