Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
Добрый день. Есть mssql 2005.
есть таблица с данными, используется двумя разными приложениями.
в ней есть идентификатор - уникальное INT в пределах таблицы.
и есть datetime поле. значение вполне можно округлить до минут

как на их основе мне сгенерить новый идентификатор опять же типа INT? с учетом того, что datetime может быть null. в этом случае старый и новый идентификатор могут совпадать.
Например
id = 3609193
datetime = 2013-07-25 11:14

Думал дописать одно к другому, но мы гарантированно выходим за рамки INT...
SELECT CONVERT(int, CONVERT(smalldatetime,getdate())) усечет дату 2013-07-25 до 5 символов, время переводить в минуты смысла нет, получится так-же 4хзначное поле.

need help :)
25 июл 13, 08:25    [14614320]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
Сергей Викт.
Member

Откуда: Москва
Сообщений: 888
kersantinov
Добрый день. Есть mssql 2005.
есть таблица с данными, используется двумя разными приложениями.
в ней есть идентификатор - уникальное INT в пределах таблицы.
и есть datetime поле. значение вполне можно округлить до минут

как на их основе мне сгенерить новый идентификатор опять же типа INT? с учетом того, что datetime может быть null. в этом случае старый и новый идентификатор могут совпадать.
Например
id = 3609193
datetime = 2013-07-25 11:14

Думал дописать одно к другому, но мы гарантированно выходим за рамки INT...
SELECT CONVERT(int, CONVERT(smalldatetime,getdate())) усечет дату 2013-07-25 до 5 символов, время переводить в минуты смысла нет, получится так-же 4хзначное поле.

need help :)

Добрый день. А по какому принципу вы хотите генерить новое значение?
25 июл 13, 08:39    [14614361]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
Сергей Викт.
Добрый день. А по какому принципу вы хотите генерить новое значение?


Плохо себе представляю. А пожалуй если бы представлял, то нагенерил уже :)
25 июл 13, 09:04    [14614448]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
kersantinov
Сергей Викт.
Добрый день. А по какому принципу вы хотите генерить новое значение?


Плохо себе представляю. А пожалуй если бы представлял, то нагенерил уже :)


Тогда новый вопрос, зачем вам это???
25 июл 13, 09:16    [14614487]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ничего не понял.

kersantinov
datetime может быть null. в этом случае старый и новый идентификатор могут совпадать.

А могут и не совпадать? Пусть тогда не совпадают, используйте identity.
25 июл 13, 09:17    [14614492]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
Владимир Меньшиков
Member

Откуда: Санкт-Петербург
Сообщений: 68
Для перевода даты в формат int лучше воспользоваться функцией
DATEDIFF(mi, DataStart, GetDate())

возвращает количество минут прошедших с DataStart

Но лучше воспользоваться уникальным ключом, потому что:
-- при 
id = 2 и time = '2013-07-25 12:53'
id = 12 и time = '2013-07-25 12:43' 
-- запрос 
select 2 + datediff(mi, '2013-01-01 00:00', '2013-07-25 12:53'), 12 + datediff(mi, '2013-01-01 00:00', '2013-07-25 12:43') 
-- возвращает 
(No column name)	(No column name)
295975	                295975

И ключ сразу же перестает быть уникальным.
25 июл 13, 09:31    [14614549]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
Владимир Меньшиков
Для перевода даты в формат int лучше воспользоваться функцией

DATEDIFF(mi, DataStart, GetDate())

И ключ сразу же перестает быть уникальным.


можно конечно
 CAST (DATEDIFF(mi, DataStart, GetDate()) as int)*100000 + id


но опять же, зависит от максимального id
+ остается вопрос "datetime может быть null"

id datetime
3609193 null
3609194 null

автору - для этих двух записей новый id2 должен быть одинаковым?

используйте identity.
25 июл 13, 11:21    [14615114]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2396
перепутал

 CAST (DATEDIFF(mi, DataStart, GetDate()) as int) + id*100000
25 июл 13, 11:22    [14615120]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
kersantinov
Плохо себе представляю. А пожалуй если бы представлял, то нагенерил уже :)
Так сначала нужно всегда ставить задачу, а не начинать программировать.

Что вообще требуется, я так и не понял.
kersantinov
как на их основе мне сгенерить новый идентификатор опять же типа INT? с учетом того, что datetime может быть null. в этом случае старый и новый идентификатор могут совпадать.
Можно сделать (новый идентификатор) = -(старый идентификатор), условие задачи будет выполнено.

Или (новый идентификатор) = 1000000000 + (старый идентификатор), если (старый идентификатор) не выходит за пределы одного миллиарда.
25 июл 13, 11:47    [14615237]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
Владимир Меньшиков
Member

Откуда: Санкт-Петербург
Сообщений: 68
StarikNavy
CAST (DATEDIFF(mi, DataStart, GetDate()) as int)*100000 + id

Зачем CAST? Datediff возвращает формат INT

StarikNavy
остается вопрос "datetime может быть null"

Кто мешает написать
CAST (DATEDIFF(mi, DateStart, IsNull(SearchDate, DateStart))
25 июл 13, 15:13    [14616731]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
Суть в следующем. Есть CRM. Есть телефония. Речь идет об общедоступной таблице - списки на обзвон из СРМ.
Есть ID в этой самой CRM. И для телефонии нужен ID.
Но ввиду особенностей телефонии и специфической задачи - для одного ID в CRM, после того как изменится значение в DATETIME поле ID для телефонии должен смениться.
Вот и получается что мне надо как-то сгенерить ID для телефонии на основе ID и DATETIME поля из CRM.
25 июл 13, 20:35    [14618575]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
[quot StarikNavy]
Владимир Меньшиков

id datetime
3609193 null
3609194 null

автору - для этих двух записей новый id2 должен быть одинаковым?


в данном случае допускается

id datetime id2
3609193 null 3609193
3609194 null 3609194
25 июл 13, 20:37    [14618577]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
Гость333
А могут и не совпадать? Пусть тогда не совпадают, используйте identity.


ID2 отсутствует как класс. мне его надо придумать.
25 июл 13, 20:39    [14618583]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
kersantinov
Но ввиду особенностей телефонии и специфической задачи - для одного ID в CRM, после того как изменится значение в DATETIME поле ID для телефонии должен смениться.
Вот и получается что мне надо как-то сгенерить ID для телефонии на основе ID и DATETIME поля из CRM.
Почему бы вам не сгенерить новый ID для телефонии как IDENTITY (как запись в новой таблице), а в этой записи сделать ссылку на ID в CRM и сохранить DATETIME, который там был?

А в том виде, как вы формулируете, сделать ничего нельзя, если только не сделать ID для телефонии типа BIGINT
25 июл 13, 20:50    [14618612]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
alexeyvg,

Тут дело даже не в наличии старого ID. от него вовсе можно не плясать. Тут дело в том, что при изменении даты-время у старой записи должен быть новый ID типа INT....
25 июл 13, 20:56    [14618642]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31446
kersantinov
Тут дело в том, что при изменении даты-время у старой записи должен быть новый ID типа INT....
Ну это вообще не проблема, назначаете новый уникальный ИД, и всё. Почему тогда какие то увязки с DATETIME и вообще рассказы об этом?

Только у вас ИМХО проблема с проектированием базы. Неправильно это, если у записи меняется идентификатор, меняться могут атрибуты.

Тогда в итоге вопрос звучит так: "Каким образом я могу в произвольный момент времени присвоить уникальному полю новое значение?".
Правильно?
25 июл 13, 21:02    [14618659]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
kersantinov
Member

Откуда:
Сообщений: 7
alexeyvg
Ну это вообще не проблема, назначаете новый уникальный ИД, и всё. Почему тогда какие то увязки с DATETIME и вообще рассказы об этом?

Только у вас ИМХО проблема с проектированием базы. Неправильно это, если у записи меняется идентификатор, меняться могут атрибуты.

Тогда в итоге вопрос звучит так: "Каким образом я могу в произвольный момент времени присвоить уникальному полю новое значение?".
Правильно?


Хочется сгенерироваnь ID именно из имеющихся значений - уложиться в один селект, ибо есть только одна таблица с данными.
Телефония же берет данные по селекту из этой таблицы.
Так-же не хочется вносить изменения в БД сторонних разработчиков.

Вообще корни проблемы растут из двух ниразу не опен-сорс решений, которые нужно скрестить :)

Можно нагородить VIEW конечно, но это будет не шибко удобно. Но похоже так и придется делать.
25 июл 13, 21:13    [14618692]     Ответить | Цитировать Сообщить модератору
 Re: Генерация идентификатора типа INT  [new]
upor
Member

Откуда:
Сообщений: 11
kersantinov
Хочется сгенерироваnь ID именно из имеющихся значений - уложиться в один селект, ибо есть только одна таблица с данными.
Телефония же берет данные по селекту из этой таблицы.
Так-же не хочется вносить изменения в БД сторонних разработчиков.

Цитата с r.oktell.ru:
автор
внешнее приложение выгружает данные в таблицу. я делаю по ней выборку для таблицы абонентов.
суть в том что мне надо сгенерить идентификатор для октелл по 2м значениям: по полю INT — идентификатор от CRM и по DATETIME полю из CRM.

У вас уже есть кроме селекта есть как минимум один insert, что Вам мешает создать identity поле в таблице, в которую грузит crm либо, если оно там уже есть, создать вторую таблицу для генерации id и формировать её через триггер?
26 июл 13, 07:43    [14619560]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить