Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.044 c
2-1136902971
Vegasnator
2006-01-10 17:22
2006.01.29
Помогите новичку!


2-1137043616
Sirus
2006-01-12 08:26
2006.01.29
Цикл по компонентам


15-1136373097
Sergey Masloff
2006-01-04 14:11
2006.01.29
Проблемы программизма как профессии. Временные ли?


15-1136959135
Барлог(с)
2006-01-11 08:58
2006.01.29
И снова про "Начинающим"


1-1133945910
Мастер Ломастер
2005-12-07 11:58
2006.01.29
Символ в нижнем или верхнем индексе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский