Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Функция Convert() + SET LANGUAGE во вьюшке  [new]
Дмитрий Исаев
Member

Откуда: Дубна
Сообщений: 185
SQL Server 2005

QA:
SET LANGUAGE Russian
SELECT right(convert(varchar(10),getdate(),6),6)
- выдаёт "сен 09".

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

SET LANGUAGE (Specifies the language environment for the session) как-то не влезает в CREATE VIEW...
14 сен 09, 17:35    [7657085]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Дмитрий Исаев
Как получить тот же результат - дату "ммм гг" по-русски - во вьюшке без изменения глобальных настроек?
Месяцев всего-то 12
Может CASE ?
14 сен 09, 17:37    [7657100]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Дмитрий Исаев


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

SET LANGUAGE (Specifies the language environment for the session) как-то не влезает в CREATE VIEW...

Ну так поменяйте язык по-умолчанию вашего коннекта. Или пускай клиентское приложение выполняет SET LANGUAGE. Имхо сервер не должен этого делать
14 сен 09, 17:38    [7657108]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Во вьюшке возвращать getdate(). Форматировать на клиенте.
14 сен 09, 17:38    [7657109]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Дмитрий Исаев
Member

Откуда: Дубна
Сообщений: 185
Уточняю проблему: есть текстовое поле с месяцем в формате "ммм гг".
Есть ряд задач вида: "отобрать последние 3 месяца".
База огромная, качать всё на клиент не вариант.

Скажу больше: у меня куча таких задач, это запросы на аксессе. Грубо говоря, мне лень переписывать каждый из них (Паганель) или лезть в исходники всех клиентских приложений (Glory). Тем более, это временная заплатка до нормальной структуры базы... Думал, вдруг есть более красивое решение. :) Но я не сообразил, что SET LANGUAGE в моём примере задаёт язык для клиента, а не для сервера, Glory спасибо за подсказку.
14 сен 09, 18:02    [7657245]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Glory
Member

Откуда:
Сообщений: 104760
Дмитрий Исаев
Уточняю проблему: есть текстовое поле с месяцем в формате "ммм гг".
Есть ряд задач вида: "отобрать последние 3 месяца".

И зачем тут тогда нужен SET LANGUAGE ?
14 сен 09, 18:03    [7657248]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Дмитрий Исаев
Member

Откуда: Дубна
Сообщений: 185
Glory
Дмитрий Исаев
Уточняю проблему: есть текстовое поле с месяцем в формате "ммм гг".
Есть ряд задач вида: "отобрать последние 3 месяца".

И зачем тут тогда нужен SET LANGUAGE ?

SET LANGUAGE Russian
SELECT * FROM T WHERE cMonth = right(convert(varchar(10),getdate(),6),6) -- для текущего месяца
Ну вот здесь - как без SET LANGUAGE? Поле-то это дурацкое по-русски.

P.S. Ну конкретно для случая "минус N месяцев" идёт параллельная задача: сконвертировать этот несчастный "ммм гг" в datetime. Тоже, вроде, без SET LANGUAGE никак.
14 сен 09, 18:15    [7657342]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Ну, если редакция сервера позволяет:

CREATE TABLE dbo.Table1
  (ID int NOT NULL identity(1, 1) PRIMARY KEY CLUSTERED,
   Value int NOT NULL,
   Period varchar(6) NOT NULL)
GO

INSERT dbo.Table1(Value, Period) VALUES(1, 'янв 09')
INSERT dbo.Table1(Value, Period) VALUES(2, 'фев 09')
INSERT dbo.Table1(Value, Period) VALUES(3, 'мар 09')
INSERT dbo.Table1(Value, Period) VALUES(4, 'апр 09')
INSERT dbo.Table1(Value, Period) VALUES(5, 'май 09')
INSERT dbo.Table1(Value, Period) VALUES(6, 'июн 09')
INSERT dbo.Table1(Value, Period) VALUES(7, 'июл 09')
INSERT dbo.Table1(Value, Period) VALUES(8, 'авг 09')
INSERT dbo.Table1(Value, Period) VALUES(9, 'сен 09')
GO

GO
ALTER TABLE Table1 ADD PeriodNew AS CONVERT(datetime, '20' + RIGHT(Period, 2) + CASE LEFT(Period, 3)
    WHEN 'янв' THEN '01'
    WHEN 'фев' THEN '02'
    WHEN 'мар' THEN '03'
    WHEN 'апр' THEN '04'
    WHEN 'май' THEN '05'
    WHEN 'июн' THEN '06'
    WHEN 'июл' THEN '07'
    WHEN 'авг' THEN '08'
    WHEN 'сен' THEN '09'
    WHEN 'окт' THEN '10'
    WHEN 'ноя' THEN '11'
    WHEN 'дек' THEN '12'
  END + '01', 112) PERSISTED

GO
CREATE INDEX Table1_PeriodNew ON dbo.Table1 (PeriodNew)
GO

SELECT * FROM Table1 WHERE PeriodNew = '20090101'
14 сен 09, 21:05    [7657919]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Дмитрий Исаев
Member

Откуда: Дубна
Сообщений: 185
Насчёт редакции не знаю, но есть причины, по которым ALTER TABLE в данном случае невозможен.
Решил в итоге обойтись функцией:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION dbo.Month_str2date (@Month varchar(6)) RETURNS datetime
AS BEGIN

declare @m varchar(2)
SELECT @m = CASE Left(@Month,3)
	WHEN 'янв' THEN '01'
	WHEN 'фев' THEN '02'
	WHEN 'мар' THEN '03'
	WHEN 'апр' THEN '04'
	WHEN 'май' THEN '05'
	WHEN 'июн' THEN '06'
	WHEN 'июл' THEN '07'
	WHEN 'авг' THEN '08'
	WHEN 'сен' THEN '09'
	WHEN 'окт' THEN '10'
	WHEN 'ноя' THEN '11'
	WHEN 'дек' THEN '12'
ELSE NULL
END

RETURN Convert(datetime, '1.' + @m + '.' + Right(@Month,2), 4) -- 'dd.mm.yy'
END
GO

Всем спасибо!
15 сен 09, 10:34    [7659129]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Дмитрий Исаев,

с чего Вы взяли, что Ваша функция будет возвращать дату, преобразованную из строки 'dd.mm.yy'??
А может, это 'mm.dd.yy'?
Или 'yy.mm.dd'?

Используйте формат без разделителей 'yyyymmdd' (112).
15 сен 09, 10:40    [7659174]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Дмитрий Исаев,

с чего Вы взяли, что Ваша функция будет возвращать дату, преобразованную из строки 'dd.mm.yy'??
А может, это 'mm.dd.yy'?
Или 'yy.mm.dd'?

Используйте формат без разделителей 'yyyymmdd' (112).
Ой, не прав я оказался! 4-й стиль в CONVERT не заметил...
15 сен 09, 10:47    [7659227]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Насчёт редакции не знаю, но есть причины, по которым ALTER TABLE в данном случае невозможен.


Если редакция Enterprise сделайте без функции вычисляемое поле во вьюшке и на него индекс.
15 сен 09, 11:00    [7659336]     Ответить | Цитировать Сообщить модератору
 Re: Функция Convert() + SET LANGUAGE во вьюшке  [new]
Дмитрий Исаев
Member

Откуда: Дубна
Сообщений: 185
pkarklin
Если редакция Enterprise сделайте без функции вычисляемое поле во вьюшке и на него индекс.
А, вот оно что. Спасибо, буду изучать. :)
16 сен 09, 13:41    [7667170]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить