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

Откуда:
Сообщений: 498
Доброго дня всем!

Есть некая табличка со столбцом данных в строковом виде типа '01.01.2014'. Проблема в том, что запрос вида:
	SELECT	   case when IsDate(RTRIM(LTRIM(pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(pole)), 104) 
	                 else Null 
	            end

отрабатывает правильно на одном сервере (возвращает значение типа datetime), а на другом - нет.
Подскажите, пожалуйста - какие настройки на это могут влиять?
Спасибо.
7 мар 14, 15:35    [15689280]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
Glory
Member

Откуда:
Сообщений: 104760
Just_Serg
отрабатывает правильно на одном сервере (возвращает значение типа datetime), а на другом - нет.

А что же вовращается на другом ?
7 мар 14, 15:45    [15689347]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
o-o
Guest
зависит от языка сессии.
т.е. и на одном сервере моЖно изобразить "то отрабатывает, то нет":
set language russian
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
------------------------
2014-01-31 00:00:00.000
	            
set language english
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
------------------------
NULL
7 мар 14, 15:46    [15689350]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
o-o
зависит от языка сессии.
т.е. и на одном сервере моЖно изобразить "то отрабатывает, то нет":
set language russian
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
------------------------
2014-01-31 00:00:00.000
	            
set language english
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
------------------------
NULL


Спасибо. А как селектом посмотреть - какая настройка сейчас применена?
7 мар 14, 15:48    [15689367]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
o-o
Guest
спровоцируйте любую ошибку :)
на каком языке сервер проругается, тот и есть язык сессии на данный момент:

set language english
select * from non_existing_table;
------------------------
Msg 208, Level 16, State 1, Line 1
Invalid object name 'non_existing_table'.


set language russian
select * from non_existing_table;
------------------------
Msg 208, Level 16, State 1, Line 2
Недопустимое имя объекта "non_existing_table".
7 мар 14, 15:52    [15689397]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Just_Serg
Спасибо. А как селектом посмотреть - какая настройка сейчас применена?

Еще одна настройка сессии, это dateformat
+
set dateformat dmy
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
go	            
set dateformat mdy
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end

посмотреть можно:
select @@language
dbcc useroptions
7 мар 14, 15:59    [15689441]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4951
Just_Serg,
http://technet.microsoft.com/ru-ru/library/ms189491.aspx
7 мар 14, 16:01    [15689458]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
o-o
Guest
нормальный способ:
select @@LANGUAGE

Returns the name of the language currently being used
7 мар 14, 16:03    [15689467]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
SomewhereSomehow
Just_Serg
Спасибо. А как селектом посмотреть - какая настройка сейчас применена?

Еще одна настройка сессии, это dateformat
+
set dateformat dmy
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
go	            
set dateformat mdy
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end

посмотреть можно:
select @@language
dbcc useroptions


А как возвратить значение настройки dateformat для сессии?
7 мар 14, 16:23    [15689566]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
Just_Serg
SomewhereSomehow
пропущено...

Еще одна настройка сессии, это dateformat
+
set dateformat dmy
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end
go	            
set dateformat mdy
declare @pole char(10) = '31.01.2014'
	SELECT	   case when IsDate(RTRIM(LTRIM(@pole))) = 1 
	                 then CONVERT(datetime, RTRIM(LTRIM(@pole)), 104) 
	                 else Null 
	            end

посмотреть можно:
select @@language
dbcc useroptions


А как возвратить значение настройки dateformat для сессии?


А, все, понял - это dbcc useroptions
7 мар 14, 16:24    [15689579]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
Только прикол в том, что

select @@language
dbcc useroptions


возвращает одинаковые значения настроек для обоих серверов, а принудительная установка:

set language russian


исправляет ситуацию.
7 мар 14, 16:27    [15689588]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
Just_Serg
Member

Откуда:
Сообщений: 498
Вобщем, проблема решена. Спасибо!
7 мар 14, 16:36    [15689618]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Не надо ничего проверять функцией ISDATE()!!!
Ведь Вы явно указываете формат 104 в функции CONVERT()!
Главное, чтобы в строке действительно было DD.MM.YYYY
А это ISDATE() гарантировать не может, ибо работает при текущем значении SET DATEFORMAT
7 мар 14, 18:42    [15690168]     Ответить | Цитировать Сообщить модератору
 Re: IsDate на разных серверах  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Да!
Того, кто придумал хранить дату в строке,
предлагаю вывести во двор и расстрелять!
7 мар 14, 18:45    [15690179]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить