Форум: "Начинающим";
Текущий архив: 2006.01.29;
Скачать: [xml.tar.bz2];
Вниз
Вопрос по дате Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.052 c