Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2011, 16:04   #1
Toshka
 
Регистрация: 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.
Toshka вне форума Ответить с цитированием
Старый 08.08.2011, 16:39   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) 047 у Вас находится в позиции 10 11 12 (считая от единицы слева направо), с чего Вы решили, что он с 7-й начинается?!

2) ну, в принципе правильно, через substring можно получить этот номер.
в чём проблема?

3) всегда неплохо (а иногда и ОЧЕНЬ ДАЖЕ ПОЛЕЗНО или ОБЯЗАТЕЛЬНО) указывать используемую СУБД...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 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
Toshka
 
Регистрация: 08.08.2011
Сообщений: 9
По умолчанию

Сори, забыла, что первые 2 нуля не считаем! Работаю в SQL Server 2008 r2,

8639039047190
отсюда начиная с 7 цифры берем 3 следующих знака и получаем 047 - относительный месяц по системе

номер получила, теперь на его основании нужно выяснить в каком году было выпущено изделие. А отчет месяцев по системе начался с 1 октября 2008года.
Toshka

Последний раз редактировалось Stilet; 19.08.2011 в 20:43.
Toshka вне форума Ответить с цитированием
Старый 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
Toshka
 
Регистрация: 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
Toshka вне форума Ответить с цитированием
Старый 09.08.2011, 15:02   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Toshka Посмотреть сообщение
Я нашла выход Все работает!
Ну вот Всё таки начальная дата на год раньше
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 09.08.2011, 15:16   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Аватар
Ну вот Всё таки начальная дата на год раньше
+100
что, в общем-то, и можно было предположить... ну годом меньше/годом больше - не принципиально...
да и серийник, заявленный в 1-м посте, тоже не такой, какой нужно... (я про '008639039047190')
но это тоже мелочи...


Toshka
КРАЙНЕ рекомендую везде, где задаёте дату в качестве константы не полагаться на настройки локали,
а переводить (в данном случае для MS SQL сервера) так:
Код:
select CONVERT(date, '31.12.2010', 104)
ну и последнее. Надеюсь, что Вам очевидно, что в данном случае можно обойтись без дополнительных переменных, одним запросом.
(хотя, если Вам это не существенно - то вариант с переменными выглядит проще и понятнее...)

Последний раз редактировалось Serge_Bliznykov; 09.08.2011 в 15:23.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.08.2011, 11:46   #9
Toshka
 
Регистрация: 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.
Toshka вне форума Ответить с цитированием
Старый 10.08.2011, 13:59   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы, наверное не всё поняли из того, что я Вам сказал...

Цитата:
Код:
set @Date = '01.09.2007' 
Это может не работать (точнее работать НЕПРАВИЛЬНО), если настройки локали/сервера будут отличаться от типичных настроек русской локали..
(дата может быть и в совсем другом формате).
Я с подобными проблемами сталкивался. Поэтому и предложил решение, которое не зависит от подобных настроек...

Это просто информация Вам к размышлению...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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