|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
08.08.2011, 16:04 | #1 |
Регистрация: 08.08.2011
Сообщений: 9
|
SQL запросы
Еще есть одна загвоздочка. Нужно из серийного номера выяснить год и месяц производства изделия на основании 7, 8 и 9 цифры. Отчет месяцев в системе начался 01.10.2008г, сейчас 047 месяц по системе - это я вычислила, а вот не соображу как теперь год вырвать из номера?
Если есть идеи буду благодарна! серийный номер для примера: 008639039047190 SELECT Z.fio, D.item, LEFT(D.item,6), SUBSTRING(D.ITEM,7,3), '', d.[oper], d.[pr_def], d.[id] FROM [SLHistory].[dbo].[zip_ceh7] z with (nolock) ____ Кросспостинг (создание одинаковых тем и сообщений) запрещён правилами форума. Будьте внимательны и соблюдайте правила. Модератор.
Toshka
Последний раз редактировалось Serge_Bliznykov; 08.08.2011 в 16:36. |
08.08.2011, 16:39 | #2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
1) 047 у Вас находится в позиции 10 11 12 (считая от единицы слева направо), с чего Вы решили, что он с 7-й начинается?!
2) ну, в принципе правильно, через substring можно получить этот номер. в чём проблема? 3) всегда неплохо (а иногда и ОЧЕНЬ ДАЖЕ ПОЛЕЗНО или ОБЯЗАТЕЛЬНО) указывать используемую СУБД... |
08.08.2011, 16:40 | #3 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
7-9 цифры 039 (если нумерация с 1). Каким образом 039 или 047 привязаны к исходной дате (1 октября или 10 января 2008?). Если это относительный номер месяца, то ни 039, ни 047 не вписывается.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
08.08.2011, 16:50 | #4 |
Регистрация: 08.08.2011
Сообщений: 9
|
Сори, забыла, что первые 2 нуля не считаем! Работаю в SQL Server 2008 r2,
8639039047190 отсюда начиная с 7 цифры берем 3 следующих знака и получаем 047 - относительный месяц по системе номер получила, теперь на его основании нужно выяснить в каком году было выпущено изделие. А отчет месяцев по системе начался с 1 октября 2008года.
Toshka
Последний раз редактировалось Stilet; 19.08.2011 в 20:43. |
08.08.2011, 17:19 | #5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
1. 047 начинается с 8-ой цифры если рассматривать 8639039047190
2. Сейчас август 2011 и З5-ый номер месяца относительно 1-го окт. 2008 3. Причем здесь 047?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
09.08.2011, 14:40 | #6 |
Регистрация: 08.08.2011
Сообщений: 9
|
Я нашла выход Все работает!
declare @SN nvarchar (30) , @Date datetime , @Date2 datetime set @Date = '01.09.2007' set @SN = '007791047006455' --вычисляем месяц по номеру и получаем текущий год set @date2 = dateadd(m,cast(SUBSTRING(@SN,7,3) as int),dateadd(m,datediff(m,0,@Date), 0)) select @date2 [Дата] ,MONTH(@date2) [Месяц] ,DATENAME (m ,@date2) [Месяц_Имя] ,YEAR (@date2) [Год] ,DATENAME (yyyy ,@date2)+' г.' [Год_Имя]
Toshka
|
09.08.2011, 15:02 | #7 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Ну вот Всё таки начальная дата на год раньше
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
09.08.2011, 15:16 | #8 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
что, в общем-то, и можно было предположить... ну годом меньше/годом больше - не принципиально... да и серийник, заявленный в 1-м посте, тоже не такой, какой нужно... (я про '008639039047190') но это тоже мелочи... Toshka КРАЙНЕ рекомендую везде, где задаёте дату в качестве константы не полагаться на настройки локали, а переводить (в данном случае для MS SQL сервера) так: Код:
(хотя, если Вам это не существенно - то вариант с переменными выглядит проще и понятнее...) Последний раз редактировалось Serge_Bliznykov; 09.08.2011 в 15:23. |
|
10.08.2011, 11:46 | #9 |
Регистрация: 08.08.2011
Сообщений: 9
|
с переменными и правда проще
Я вот так сделала: declare @SN nvarchar (30) , @Date datetime set @Date = '01.09.2007' set @SN = '007791047006455' Select year(DATEADD(m,cast(SUBSTRING(@SN,7 ,3) as int),@Date)) [Год] Примитивно, но работает!!! ))))
Toshka
Последний раз редактировалось Stilet; 19.08.2011 в 20:46. |
10.08.2011, 13:59 | #10 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Вы, наверное не всё поняли из того, что я Вам сказал...
Цитата:
(дата может быть и в совсем другом формате). Я с подобными проблемами сталкивался. Поэтому и предложил решение, которое не зависит от подобных настроек... Это просто информация Вам к размышлению... |
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
SQL запросы | Frosts | Помощь студентам | 2 | 18.05.2011 11:24 |
SQL запросы | akimov_aleks | БД в Delphi | 3 | 21.04.2010 05:42 |
SQL запросы | Best Programmist | Microsoft Office Access | 8 | 03.12.2009 16:42 |
sql запросы | wolf950 | БД в Delphi | 2 | 28.11.2008 21:26 |