Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по дате [D7, MSSQL]


Страницы:   1 2

VadimSpb ©   (2006-01-14 13:48:00) 

Всем добрый день!
Ввожу данные в таблицу SQL SERVER 2005. Одно из полей типа DateTime. Требуется формат месяц/дата/год
Получаю дату методом Date в Delphi в формате дата/месяц/год.
Использую FormatDateTime для преобразования формата. Все ОК.
Вопрос: это штатная ситуация при работе с БД или могут быть грабли на различных ОС или региональных настройках?


evvcom   (2006-01-16 09:16:00) [1]


> вот только он тебе как пользователю при SELECT в более красивом
> формате представляет. Его формат зависит от настроек сервера
> и настроек ОС

Очень я сомневаюсь, что сам сервер предоставляет его в "более красивом формате". Представлять в "более красивом формате" - задача клиента, а не сервера. Сервер выдает в своем формате, но однозначно трактуемом, причем совсем необязательно в double или чем еще другом. Provider знает этот формат и, возможно, преобразовывает его к какому-то другому, который является стандартом на входе/выходе для выбранного движка, чтобы уйти от привязки к конкретному серверу. Далее дельфовые компоненты доступа, зная формат провайдера, опять же возможно, если этот формат отличается от принятого в Delphi, преобразовывает к Double (TDateTime).

> А сервер требует "месяц/день/год",

Ты еще и без параметров работаешь? Да... Вот если бы ты использовал параметры и хранимые процедуры, то клиент (твои компоненты доступа) сам(и) определил(и) бы, что твой параметр типа дата, и даже твои никчемные преобразования к стрингу правильно бы интерпретировались. А вообще, добавь параметры, без ХП возможно тип параметра сам не определится, укажи что это дата, и присваивай ParameterDataSet.ParamByName('MyDateTimeParam').AsDateTime := AnyDateTimeValue;


Fay   (2006-01-15 14:29:00) [2]

2 Nikolay M. ©   (15.01.06 13:33) [20]
> что данные в 8 байтах можно трактовать как угодно
Сокровенный смысл этих слов я так и не постиг, так что не знаю даже, согласен я с этим утверждением, или нет.

> зацепила категоричность, что DATETIME - это не Double
Что можно сказать... Жизнь - это не только праздник, есть ещё и суровые будни.


Nikolay M.   (2006-01-15 13:33:00) [3]


> Fay ©   (15.01.06 01:22) [18]

БОЛ я регулярно почитываю, про то, как хранится DATETIME, в курсе и с тобой, собственно, ни о чем не спорю. Просто несколько зацепила категоричность, что DATETIME - это не Double, поэтому я и прицепился с тем, что данные в 8 байтах можно трактовать как угодно - хоть датой, хоть даблом, хоть длинным целым.

И ко мне лучше на Ты. Если есть желание, стукнись в аську, если пользуешься. Имхо, мы можем быть друг другу полезными :)


Fay   (2006-01-15 01:23:00) [4]

в смысле "грус тно", конечно


Fay   (2006-01-15 01:22:00) [5]

2 Nikolay M. ©   (14.01.06 23:42) [17]
> Конечно, если аргументируешь...
1) Аргументировать ничего не нужно - есть BOL
2) Если есть желание, можно с пом. bcp.exe вызрузить что-нибудь в "родном" формате
3) Попробуйте сохранить дату '20051231 00:00:00.002'
4) Выполните
 declare @s varchar(20)
 select @s = '123'
 select right(@s + 1, 2)
, попробуйте "аргументировать", что varchar - не число.

P.S.
Очень грусно видеть такие странные заявления в Вашем исполнении


Nikolay M.   (2006-01-14 23:42:00) [6]


> Fay ©   (14.01.06 23:18) [16]
> > Как Double, так и DATETIME - это 8 байт
> Странный аргумент.

Это не аргумент, а просто лирическое отступление, что 8 байт могут трактоваться как угодно.

SELECT CAST(getdate () AS FLOAT)

SELECT CAST (getdate () AS VARBINARY)

В первом случае - это число (дата-время), во втором - те самые 8 байт, которыми это число представлено и которое вполне конкретным образом трактуется как дата-время.


> > В нашем случае это вещественные числа
> В каком, простите, случае?

В случае MS SQL-вского DATETIME.

SELECT getdate (), getdate () + 1.5

Складывает? Возвращает дату, на 1.5 суток вперед? Так что еще надо для счастья?
Конечно, если аргументируешь, что (SMALL)DATETIME - это не вещ. числа, буду рад новым знаниям.


Fay   (2006-01-14 23:18:00) [7]

2 Nikolay M. ©   (14.01.06 22:41) [15]
> Как Double, так и DATETIME - это 8 байт
Странный аргумент.

> В нашем случае это вещественные числа
В каком, простите, случае?


Nikolay M.   (2006-01-14 22:41:00) [8]


> Fay ©   (14.01.06 21:38) [13]

Он почти прав. Как Double, так и DATETIME - это 8 байт. А уж форма представления данных в них - это отдельный вопрос, может вещественное число, может строка символов. В нашем случае это вещественные числа, целая часть которых - кол-во дней с некоторой даты, а дробная - время.


VadimSpb   (2006-01-14 22:14:00) [9]

Values with the datetime data type are stored internally by the Microsoft SQL Server 2005 Database Engine as two 4-byte integers. The first 4 bytes store the number of days before or after the base date: January 1, 1900. The base date is the system reference date. The other 4 bytes store the time of day represented as the number of milliseconds after midnight.


Fay   (2006-01-14 21:38:00) [10]

2 Desdechado ©   (14.01.06 15:57) [7]
> для MSSQL дата тоже DOUBLE
Это ложь. Читайте BOL.


VadimSpb   (2006-01-14 17:26:00) [11]


> А придется, поскольку именно азами и не владеешь.

Ну что ж, осваиваем SQL, коль необходимость такая возникла ...
Полагаю, что не стыдно спросить, стыдно не знать.


Anatoly Podgoretsky   (2006-01-14 17:11:00) [12]

VadimSpb   (14.01.06 17:04) [10]
Полагал, что не надо предметно описывать известные азы.

А придется, поскольку именно азами и не владеешь.


VadimSpb   (2006-01-14 17:04:00) [13]


> нам все понятно. это наоборот тебе непонятно то, что дататайм
> - число

Напротив, это давно известный факт :-))))
Полагал, что не надо предметно описывать известные азы.
Дату передавал в стринге типа DateToStr(Date). Вот здесь и возвращается отформатированное значение даты как "дата/месяц/год". А сервер требует "месяц/день/год", в противном случае выдает ошибку конвертации формата. Интуитивно чувствовал, что так делать не следует, поэтому вопрос и задал.
Спасибо
> Desdechado ©   (14.01.06 15:57) [7]

Сделал через параметр, пока проблем нет, надеюсь и не будет.


sniknik   (2006-01-14 16:14:00) [14]

> Если я криво описал п.1 и п.2, поясните, что непонятно.
нам все понятно. это наоборот тебе непонятно то, что дататайм - число. и соответственно у него не может быть "формата дата/месяц/год". (ни /, ни двух .., ни # или любого другого разделителя (вернее двух, один можно любой в настройках форматов поставить))
...
даже не знаю чего еще сказать.... если мне говорят что "Date в Delphi возвращает число в формате дата/месяц/год"... это не кривое описание, это лож чистой воды.

> Что здесь понимается под "синхронизацией форматов"?
если уж пользуешся строкой при передаче из программы в программу/системы в систему то уж будь добр позаботься о том чтобы разбор строки происходил в соответствии с темиже правилами что и "сборка".
только это и понимается.

> главное найти правильное решение.
самый простой метод решить это уйти от "описательных" методов изложения проблемы... они всегда менее действенны.


Nikolay M.   (2006-01-14 16:02:00) [15]


> Пробуем еще раз.
> 1. Получаю дату методом Date в Delphi в формате дата/месяц/год
> 2. Т.к. для mssql требуется формат месяц/дата/год, использую
> FormatDateTime для преобразования формата дата/месяц/год
> в месяц/дата/год. Все ОК. Кстати о числах ... ;-))


Пробуем.

1) Смотрим справку в Дельфи по Date function, видим тип возвращаемого значения: TDateTime, смотрим справку по TDateTime, видим, что это Double - обычное число с правающей точкой. Объясни непонятливым, где в числе 38729 спрятаны день, месяц и год и как ты умудрился получить его в каком-то "формате"? Как только ответишь правильно на этот вопрос себе (не мне, конечно) - все встанет на свои места.

2) И как он это требует? Стучит ногами и кричит "а ну подать сюда Ляпкина-Тяпкина!"? :) Без ответа на 1) смысла обсуждать 2) нет :(


Desdechado   (2006-01-14 15:57:00) [16]

1. "метод" Date возвращает DOUBLE, а не "дату в формате"
дата в формате - это способ педставления данных пользователю
2. для MSSQL дата тоже DOUBLE, вот только он тебе как пользователю при SELECT в более красивом формате представляет. Его формат зависит от настроек сервера и настроек ОС, где сервер стоит
Если ты пытаешься передать на сервер дату в виде строки, то это грубая ошибка и источник разных проблем, т.к. формат даты в системе клиента может быть другой, попытки сконвертировать через Format еще хуже.
Поэтому используй параметры в запросах, а им можно легко присваивать TDateTime==Double


VadimSpb   (2006-01-14 15:46:00) [17]

Пробуем еще раз.
1. Получаю дату методом Date в Delphi в формате дата/месяц/год
2. Т.к. для mssql требуется формат месяц/дата/год, использую FormatDateTime для преобразования формата дата/месяц/год в месяц/дата/год. Все ОК. Кстати о числах ... ;-))

Если я криво описал п.1 и п.2, поясните, что непонятно.


> что точно, так это, "грабли на различных региональных настройках"
> точно будут если подобные преобразования присутствуют, передаются
> в различные системы, и накаких действий по синхронизации
> форматов систем не сделано.

Что здесь понимается под "синхронизацией форматов"?


> p.s. не обижайся но это тоже "уйдет" в начинающие... см.
>  правила форума.

Меня это не беспокоит - главное найти правильное решение.


Nikolay M.   (2006-01-14 15:00:00) [18]


> Разумеется числа ... :-))
> Вводим 14.01.2006 - ошибка
> Вводим 01.14.2006 - ОК!


А на какой планете "14.01.2006" является числом? У нас, землян, принято считать, что число - это, например, 38729, т.е. кол-во дней между 1 января 1900 и 14 января 2006.


sniknik   (2006-01-14 14:57:00) [19]

> Разумеется числа ... :-))
судя по
> Получаю дату методом Date в Delphi в формате дата/месяц/год.
не совсем разумеется.

> Вводим 14.01.2006 - ошибка
> Вводим 01.14.2006 - ОК!
ранее писал используеш FormatDateTime, ???, ... т.е. для перевода из даты в строку, сейчас пишеш строку (введенную) переводиш в дату. в чем правда брат? © не помню чей.

> Может вводить надо ... хм .. иначе? ;-))
может быть... смысла действий по "переводу" не обьяснено.

что точно, так это, "грабли на различных региональных настройках" точно будут если подобные преобразования присутствуют, передаются в различные системы, и накаких действий по синхронизации форматов систем не сделано.


VadimSpb   (2006-01-14 14:31:00) [20]


> дата, дататайм, тайм  это вообщето числа...

Разумеется числа ... :-))
Вводим 14.01.2006 - ошибка
Вводим 01.14.2006 - ОК!
Может вводить надо ... хм .. иначе? ;-))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо