Выделить из DateTime отдельно Date и отдельно Time (не Format и не CDate)

knocking
Дата: 05.11.2009 10:44:29
Доброго дня, уважаемые. (Поиском пользовался уже 3 дня не найду ответ)
Нужно сделать стабильно работающий механизм, не зависящий от рег.настроек.
Delphi, Access, АDO.
В БД есть поле MyDateTime тип DateTime
В Grid нужно вывести два столбца MyDate и МyTime из этого поля MyDateTime
Делаю

SQL.Add('
SELECT
    INT(MyDateTime) As MyDate, Frac(MyDateTime) As MyTime
FROM
    MyBD
WHERE
    MyDate'+ZnakRavenstva1+':pMyDate 
        AND 
    MyTime'+ZnakRavenstva2+':pMyTime');

Parameters.ParamByName('pMyDate').Value:=cxDateEdit.Date;
Parameters.ParamByName('pMyTime').Value:=cxTimeEdit.Time;


Написал на память, но смысл такой :)
Чтобы все это работало независимо от региональных настроек решил использовать параметры запроса и устанавливать значения параметров из какого-нибудь TDateEdit. Так наверно будет правильно.

Вся проблема с выделением времени из поля типа DateTime. INT работает, на Frac ругается.

Format и CDate не подходят из-за рег.настроек, т.к. на выходе String. CAST тоже не работает в Аксесе.

Как правильно выделить Дату и Время из DateTime? Спасибо.

З.Ы. Пишут: Читай ФАК по ДатеВремени. Я его не нашел.
CoolMind
Дата: 05.11.2009 10:50:00
knocking, по-моему, есть ещё функции TimeValue, DateValue.
knocking
Дата: 05.11.2009 10:56:58
CoolMind, DateValue работает, а TimeValue(MyDateTime) As TimeOpen выводит "30.12.1899 14:10:10". Надо чтоб просто "14:10:10".
CoolMind
Дата: 05.11.2009 11:00:28
knocking, да, есть такой глючок. Не помню, как с ним бороться. Разве что вычесть из полученного значения целое число, равное 30.12.1899...
knocking
Дата: 05.11.2009 11:07:50
Пробовал вот так :

MyDateTime - INT(MyDateTime) As MyTime

Тогда на выходе что то типа: 0,9348923423.

Как тогда обратно в дату это конвертнуть? Хотелось бы сделать нормальный механизм. Правильный.
Rivkin Dmitry
Дата: 05.11.2009 11:20:07
А что имеется ввиду "не зависящий от рег.настроек"? Т.е. в каком-то постоянном формате? Или, таки, в формате региональных настроек?
Владимир Саныч
Дата: 05.11.2009 11:23:37
knocking
выводит "30.12.1899 14:10:10". Надо чтоб просто "14:10:10".

Имхо, это проблема только форматирования на выводе. Значение - правильное.
knocking
Дата: 05.11.2009 11:31:52
Rivkin Dmitry, как в формате рег.настроек. Т.е. вот такая штука Format(MyDateTime,"hh:nn:ss") не годится, может в рег.настройках разделитель не ":".

Можно конечно через GetLocaleFormatSettings() сделать.

Пробовал так:
GetLocaleFormatSettings(LOCALE_STIME,LocalSettings);
SepT:=LocalSettings.TimeSeparator;

Format(MyDateTime,"hh'+SepT+'nn'+SepT+'ss") As MyTime

Но тоже вроде как то не профессионально. Мне кажется должна быть какая-то простая специальная функция типа TimeValue(MyDateTime) или какая-нибудь просто Time(MyDateTime) или еще какая. В справке по Аксесу вообще не нашел функций по написанию запросов для ДатыВремени.
qwrqwr_
Дата: 05.11.2009 11:33:50
knocking

В БД есть поле MyDateTime тип DateTime
В Grid нужно вывести два столбца MyDate и МyTime из этого поля MyDateTime
Как правильно выделить Дату и Время из DateTime? Спасибо.
Если нужно только вывести, то имхо самое простое -
просто обратится дважды к полю MyDateTime,
сделав в гриде соответствующие форматы вывода этим 2 полям -
чтобы одно показывало только дату, а второе только время.
И не нужно делать никаких преобразований в SQL-запросе.

ЗЫ Дату-время акцесс хранит как Double, в котором целая часть - дата, дробное-время (кусочек соответствующего дня).
Исходя из этого можно делать всяческие преобразования.

ЗЫ №2 Целая часть даты - кол-во дней, прошедшее с 30 декабря 1899 года.
Поэтому вполне естественно, что, например, дробь 0,25 преобразуется в акцесс в 30.12.1899 06:00:00
( а вычитать из этого "целое число, равное 30.12.1899" можно до посинения)
Владимир Саныч
Дата: 05.11.2009 11:38:56
Автор, поскольку Вы проигнорировали мой ответ, то задам наводящий вопрос. Вам нужно значение для обращения из программы или текст для вывода на экран/принтер?