C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DateTime & TDate
full_lamer
Отправлено: 07.06.2004, 17:28


Машинист паровоза

Группа: Участник
Сообщений: 225



Доброго времени суток!
Соскучились по моим глупым вопросам? cool.gif
У меня такой вопрос: в 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") — это действительно очень удобно, красиво и практично. smile.gif
olegenty
Отправлено: 09.06.2004, 14:09


Ветеран

Группа: Модератор
Сообщений: 2412



ха. я-то думал работа посредством ADO компонентов ведётся...

Вернуться в Работа с базами данных в C++Builder