full_lamer |
Отправлено: 07.06.2004, 17:28 |
|
Машинист паровоза
Группа: Участник
Сообщений: 225
|
Доброго времени суток!
Соскучились по моим глупым вопросам?
У меня такой вопрос: в Builder TDate имеет формат "dd.mm.yyyy", а в MS SQL Server 'yyyy-mm-dd', так вот есть ли какой нибудь простой способ преобразования между типами...?
может я просто что-то недочитал — ну как обычно?
|
|
Gedeon |
Отправлено: 07.06.2004, 18:10 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Ну да. Если внимательно почитать хэлп по TSQL то там можно увидеть просто немеряно форматов отображения даты. Далее за преобразование типов между клиентом и сервером отвечает драйвер, не надо ничего руками делать.
|
|
olegenty |
Отправлено: 08.06.2004, 06:13 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
это как со стаканом: он наполовину пуст, либо наполовину полон. но там одно и то же количество жидкости.
CODE |
CREATE function dbo.date2str (@d DateTime)
returns varchar(30)
AS
begin
declare @str varchar(30);
declare @ds varchar(30);
set @ds = convert(Varchar(30), @d, 120);
--print @ds;
set @str = substring(@ds, 1, 10) + '.' +
substring(@ds, 12, 2) + '-' +
substring(@ds, 15, 2) + '-' +
substring(@ds, 18, 2);
--print @str;
return @str;
end
|
вчитайся вот в этот код, может почерпнёшь что-то новое...
|
|
Snake |
Отправлено: 08.06.2004, 09:17 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
Я поступал следующим образом: дату преобразовывал к строке вида "yyyymmdd" и так вставлял в поле типа "дата". А MSSQL, в соответствии с локальными настройками, сам интерпретировал дату. |
|
olegenty |
Отправлено: 08.06.2004, 09:30 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
да не надо её ни к чему преобразовывать...
|
|
Snake |
Отправлено: 09.06.2004, 09:38 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
QUOTE (olegenty @ 08/06/2004, 10:32) | да не надо её ни к чему преобразовывать... |
В своей процедуре ты делаешь преобразование даты по формату 120 (ODBC canonical, yyyy-mm-dd hh:mi:ss(24h) ). Но дело в том, что на свете есть не только ODBC. Я, например, предпочитаю SQLAPI.
И есть большие подозрения, что у MSSQL внутреннее представление хранения даты именно yyyymmdd hh:mi:ss. А если это так, то после твоего преобразования, сервер делает еще раз свое, что не может сказаться на производительности. |
|
Gedeon |
Отправлено: 09.06.2004, 12:07 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
Хочу заметить, что дата хранится в виде числа, равного количеству милисекунд прошедших с какого-то установленного заранее времени(кажись Рождества Христова ИМХО) и данное преобразование происходит всегда.
|
|
Snake |
Отправлено: 09.06.2004, 13:05 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 22
|
QUOTE (Gedeon @ 09/06/2004, 13:09) | Хочу заметить, что дата хранится в виде числа, равного количеству милисекунд прошедших с какого-то установленного заранее времени(кажись Рождества Христова ИМХО) и данное преобразование происходит всегда. |
Это понятно. Я имел в виду то, что "родное" представление даты именно "yyyymmdd".
Взять тот же SQLAPI. Это невизуальный компонент, по сути просто класс. Использование примерно следующее:
obj.SetCommandLine("SELECT ....");
obj.Execute();
И у меня возник вопрос, а как же работать с датами? Дата, введенная клиентом, содержится в переменной типа TDateTime. И что писать в строке запроса, использовать CONVERT или CAST? Так вот, мне посоветовали на клиенте привести к "yyyymmdd" при помощи TDateTime::FormatString("yyyymmdd") ) и работать с датами, как со строками. То есть, писать:
SELECT * FROM tbl WHERE date1 = '20040509'
Таким образом, вне зависимости от локальных настроек даты сервера и клиента, всегда будет однозначное правильное трактование даты.
Что же дешевле: преобразовать дату на клиенте в строку и дать серверу в готовом виде или заставлять сервер для каждой строки преобразовывать строку в дату, согласно указанному формату?
Да, кто посоветовал, не помню за давностью лет (кажется, www.sqlcentral.com). С 2000 года несколько программ (написанных на BCB, Visual C++, Clarion) успешно работают таким способом. Так что это не только теория. Не хочу навязывать свою точку зрения. Кому-то это покажется неудобным, мне и моим товарищам -- это удобно и это работает.
|
|
Gedeon |
Отправлено: 09.06.2004, 13:26 |
|
Ветеран
Группа: Модератор
Сообщений: 1742
|
QUOTE (Snake @ 09/06/2004, 14:07) | Что же дешевле: преобразовать дату на клиенте в строку и дать серверу в готовом виде или заставлять сервер для каждой строки преобразовывать строку в дату, согласно указанному формату?
|
Собственно запрос то в любом случае — это строка, поэтому, все конечно от контрола ввода зависит(т.е. в каком виде он дату отдает), к строке в явном или неявном виде преобразование происходит всегда, а вот формирование даты с помощью TDateTime::FormatString("yyyymmdd") — это действительно очень удобно, красиво и практично.
|
|
olegenty |
Отправлено: 09.06.2004, 14:09 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
ха. я-то думал работа посредством ADO компонентов ведётся...
|
|