Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.29;
Скачать: CL | DM;

Вниз

Вопрос по дате   Найти похожие ветки 

 
VadimSpb   (2006-01-14 13:48) [0]

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


 
sniknik ©   (2006-01-14 14:10) [1]

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

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


 
sniknik ©   (2006-01-14 14:13) [2]

упс. сорри. я тебя спутал с другим, посему "тоже" не уместно. но все остальное "в силе" ;о).


 
VadimSpb   (2006-01-14 14:31) [3]


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

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


 
sniknik ©   (2006-01-14 14:57) [4]

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

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

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

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


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


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


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


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

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

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


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

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


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

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


 
Desdechado ©   (2006-01-14 15:57) [7]

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


 
Nikolay M. ©   (2006-01-14 16:02) [8]


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


Пробуем.

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

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


 
sniknik ©   (2006-01-14 16:14) [9]

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

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

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


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


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

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

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


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

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

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


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


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

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


 
Fay ©   (2006-01-14 21:38) [13]

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


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

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.


 
Nikolay M. ©   (2006-01-14 22:41) [15]


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

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


 
Fay ©   (2006-01-14 23:18) [16]

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

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


 
Nikolay M. ©   (2006-01-14 23:42) [17]


> 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-15 01:22) [18]

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.
Очень грусно видеть такие странные заявления в Вашем исполнении


 
Fay ©   (2006-01-15 01:23) [19]

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


 
Nikolay M. ©   (2006-01-15 13:33) [20]


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

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

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


 
Fay ©   (2006-01-15 14:29) [21]

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

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


 
evvcom ©   (2006-01-16 09:16) [22]


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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2006.01.29;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.045 c
1-1135617694
321123
2005-12-26 20:21
2006.01.29
как обнаружить Excel в фоновом режиме


15-1136585297
Ag.Smit
2006-01-07 01:08
2006.01.29
ASUS ATI Radeon 9600pro глючит!!!


2-1137396453
Silver__Dragon
2006-01-16 10:27
2006.01.29
Помощь при работе со съемными носителями.....


2-1136799037
softmaster
2006-01-09 12:30
2006.01.29
DBLookupComboBoxEh


11-1118239821
Haker
2005-06-08 18:10
2006.01.29
MainMenu