Как узнать стиль форматирования даты сервера

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Как узнать стиль форматирования даты сервера

Сообщение sergey-911 » 17.05.2005 (Вт) 23:18

Всем доброго времени суток.
В клиенте применяю таблицу VSFlexGrid, заполняю его из БД на SQL сервере. Пользователь может редактировать данные, прямо в таблице. После нажатия на ввод, срабатывает вложенная процедура, в которую передается информация (название поля, новое содержимое, идентификатор, индефикатор пользователя). На сервере формируется из перечисленных составляещих оператор "Update", затем выполняется. Работает все ОК. В таблице есть поле, с датами сдачи конструкторской документации. Здесь и вылезли проблемы. В зависимости от настроек клиента и сервера, дата не воспринимается. К примеру 29 - воспринимается месяцем и выдается ошибка. Поэтому, в процедуре, в зависимости от поля, сделал проверку и преобразование даты.
Код: Выделить всё
If @Pole = 'DateOut'
BEGIN
   SET @Znach = CAST (CONVERT([smalldatetime], @Znach, 104) AS [varchar](250))
END

Все заработало, и я стал эксперементировать с разными настройками даты в ОС сервера и клиента. Вылезли еще косяки.
А теперь, Вопрос. Как во вложенной (хранимой) процедуре, узнать стиль форматирования даты на самом SQL сервере (цифра "104", в приведенном примере), чтобы хранимая процедура преобразовывала дату, в зависимости от настроек сервера?
На всякий случай, ниже - весь код процедуры:
Код: Выделить всё
CREATE PROCEDURE [sp_EditZnachKOI]

   (@KOI_ID    [varchar](10),         --идентификатор КОИ
    @Izmen   [varchar](10),         --идентификатор пользователя, изменившего запись
    @Pole       [varchar](15),         --наименование поля в таблице "KOI_Rekv"
    @Znach    [varchar](250))         --значение

AS

DECLARE @zapros   [varchar](8000)         --переменная, в которой хранится выполняемый запрос

If @Pole = 'DateOut'
BEGIN
   SET @Znach = CAST (CONVERT([smalldatetime], @Znach, 104) AS [varchar](250))
END

IF @Znach IS NULL   --сравниваем значение с NULL
BEGIN         --значение = NULL ==> вставляем слово NULL
   SET @zapros = "UPDATE [Constructor].[dbo].[KOI_Rekv] "
   SET @zapros = @zapros + "SET [" + @Pole + "] = " + "NULL" + ", "
   SET @zapros = @zapros + "[Izmen] = '" + @Izmen + "' "
   SET @zapros = @zapros + "WHERE [KOI_ID] = '" + @KOI_ID + "'"
END
ELSE
BEGIN         --значение не равно NULL ==> вставляем результат
   SET @zapros = "UPDATE [Constructor].[dbo].[KOI_Rekv] "
   SET @zapros = @zapros + "SET [" + @Pole + "] = '" + @Znach + "', "
   SET @zapros = @zapros + "[Izmen] = '" + @Izmen + "' "
   SET @zapros = @zapros + "WHERE [KOI_ID] = '" + @KOI_ID + "'"
END

EXECUTE (@zapros)

--EXECUTE [sp_EditZnachKOI] @KOI_ID = 99, @Izmen = 1, @Pole = DateOut, @Znach = '25.04.2005'   --запуск

Буду очень признателен любой информации.
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 18.05.2005 (Ср) 9:21

Не мудри - передавай дату датой, а если нужно динамически собрать строку используй формат yyyymmdd.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.05.2005 (Ср) 11:09

sp_helpdb mydb
но учти, что ты должен иметь права на запуск к этой базе

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.05.2005 (Ср) 17:52

Andrey
В зависимости от настроек клиента и настоек сервера, приложение работает в некоторых случаях криво. Если на сервере убрать преобразование даты
Код: Выделить всё
SET @Znach = CAST (CONVERT([smalldatetime], @Znach, 104) AS [varchar](250))

, то косяков - хоть отбавляй. На одном SQL сервере - все ОК, на другом, с другими временными настройками - не срабатывает схожая процедура. А все сервера настроить под себя не могу. Поэтому в клиенте сравниваю текстовое поле с датой. В случае утвердительного условия - срабатывает процедура. В ней тоже происходит преобразование даты.
Андрей. Что в данном слчае ты име - передавай дату - датой? :D
С уважением, Сергей.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.05.2005 (Ср) 18:01

он имел ввиду как параметр хранимой процедуры:

Код: Выделить всё
CREATE PROCEDURE MyProc
@Date datetime
AS

SELECT * from Table1 where InsertDate>@Date

GO

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.05.2005 (Ср) 18:06

Konst_One
Разьве процедура "sp_helpdb mydb" выводит стиль форматирования даты на самом SQL сервере ? Я не нашел. Есть информация о размере, дате создания базы. Число со стилем форматирования - так и не получил. Допуск к базе - полный.
В идеале, должно получиться что-то, наподобие
Код: Выделить всё
SET @Znach = CAST (CONVERT([smalldatetime], @Znach, Select 'Стиль форматирования' From 'mydb') AS [varchar](250))

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

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 18.05.2005 (Ср) 18:09

Konst_One
А я тебе вопрос в это время писал. А ты - тут-кактут! :D
Такой вариант мне не подойдет. Передаваемая переменная - не обязательно дата. Это может быть любое поле таблицы.
С уважением, Сергей.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 19.05.2005 (Чт) 6:51

sergey-911 писал(а):А все сервера настроить под себя не могу. Поэтому в клиенте сравниваю текстовое поле с датой. В случае утвердительного условия - срабатывает процедура. В ней тоже происходит преобразование даты.


Я уже писал - если хочешь чтобы любой сервер нормально воспринимал дату переданную как строка то передавай ее в формате yyyymmdd, например:

Код: Выделить всё
cn.Execute "spTest '20050519'"


А процедура на сервере должна выглядеть примерно так:

Код: Выделить всё
CREATE PROCEDURE spTest
@Date smalldatetime
AS
SELECT * FROM Table1 WHERE InsertDate>@Date
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 19.05.2005 (Чт) 11:17

sp_helpdb дает в поле status информацию о сортировке:

Status=ONLINE, Updateability=READ_WRITE, UserAccess=MULTI_USER, Recovery=SIMPLE, Version=539, Collation=Cyrillic_General_CI_AS, SQLSortOrder=0, IsAutoShrink, IsTornPageDetectionEnabled, IsAutoCreateStatistics, IsAutoUpdateStatistics

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.05.2005 (Чт) 18:12

Andrey, завтра на работе попробую. Дома такой вариант - срабатывает, т.к. настройка сервера yy-mm-dd, на работе настроен по другому. Спасибо огромное. :D
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 19.05.2005 (Чт) 18:32

Спасибо Konst_One. :D
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 21.05.2005 (Сб) 22:55

На работе сервер SQL версии 7. Показал при выполнении хранимой процедуры
Код: Выделить всё
sp_helpdb
- белеберду, а не стиль форматирования даты. Дома SQL 2000 - все работает (при выполнении этой же процедуры).

Если выполняю
Код: Выделить всё
cn.Execute spTest '20050519'

- процедура срабатывает нормально и дома и на работе. Интересно, при любой языковой настройки сервера SQL америкосовская настройка "yyyymmdd" будет восприниматься им корректно?
С уважением, Сергей.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 22.05.2005 (Вс) 15:04

2 sergey-911: Во-первых, вот это:
http://bbs.vbstreets.ru/viewtopic.php?p=109318#109318
И не только это сообщение, там вообще весь топик познавательный :).

Далее, MSSQL 7 и MSSQL 2000 очень сильно отличаются друг от друга именно в плане региональных настроек. Такое понятие, как collation, впервые появилось именно в восьмерке, поэтому тебе sp_helpdb в старой версии и возвращает всякую чушь. Куда именно за такими вещами надо лезть в семерке - извини, не помню, а посмотреть уже негде, у меня сейчас все серваки на 2000 пашут :).

Да, формат 'yyyymmdd' интерпретируется однозначно и независимо как от региональных настроек сервака, так и от версии MSSQL. И это не американский формат, это внутренний формат самого сервера.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 22.05.2005 (Вс) 23:46

Спасибо тебе огромное за разъяснение, Вадим :)
С уважением, Сергей.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 23.05.2005 (Пн) 12:00

Не за что :).

Советую вот что еще посмотреть:
http://msdn.microsoft.com/library/defau ... t_052s.asp
Не исключено, что именно такое решение тебя устроит больше всего :).

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 23.05.2005 (Пн) 22:33

Спасибо за информацию, Вадим. Позновательно.
С уважением, Сергей.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList