Страница 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, какой ещё клиент

Добавлено: 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... Удобно. Прямо в запросе легко посчитать.