Date 2 Integer

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Date 2 Integer

Сообщение avenger » 14 фев 2008, 14:12

Привет Всем! Есть какой способ сделать преобразование Date->Integer?

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

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Date 2 Integer

Сообщение stix-s » 14 фев 2008, 14:21

avenger писал(а):Привет Всем! Есть какой способ сделать преобразование Date->Integer?

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

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Re: Date 2 Integer

Сообщение avenger » 14 фев 2008, 14:31

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

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

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

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

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Date 2 Integer

Сообщение stix-s » 14 фев 2008, 14:44

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.
Вообще-то формат отображаемой даты ИМХО в региональных настройках, а не в сервере зашит.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Date 2 Integer

Сообщение hvlad » 14 фев 2008, 14:50

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.
Вообще-то формат отображаемой даты ИМХО в региональных настройках, а не в сервере зашит.
У него - варчар.

См. диалекты

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Re: Date 2 Integer

Сообщение avenger » 14 фев 2008, 14:57

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

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Date 2 Integer

Сообщение hvlad » 14 фев 2008, 15:05

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Re: Date 2 Integer

Сообщение avenger » 14 фев 2008, 15:18

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

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

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Date 2 Integer

Сообщение hvlad » 14 фев 2008, 16:18

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 фев 2008, 16:40

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 фев 2008, 17:21

Базы-то может и в третьем, а один из коннектов в первом.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 фев 2008, 17:46

а один из коннектов в первом.
ну так нефиг :)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 14 фев 2008, 19:41

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

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 14 фев 2008, 19:56

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

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Сообщение Kotъ-Begemotъ » 14 фев 2008, 20:58

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

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

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 14 фев 2008, 22:12

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 14 фев 2008, 23:46

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 14 фев 2008, 23:53

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

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 15 фев 2008, 00:04

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

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

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Сообщение Kotъ-Begemotъ » 15 фев 2008, 06:41

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

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

Ответить