powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Преобразование даты
32 сообщений из 32, показаны все 2 страниц
Преобразование даты
    #38868668
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB 2.5, IBExpert, IBX.

В таблицах поля, содержащие дату, определены как: "DT DATE,"

В результате запроса select dt from tbl дата показывается в формате dd.mm.yyyy. Что в IBExpert, что на клиенте (IBX в Дельфи).
Еще есть представление, в котором участвует эта же таблица. Выдранная из таблицы представлением дата при запросе к нему (select * from view1) показывается в формате yyyy-mm-dd. Также, что в IBExpert, что на клиенте.
ХП для разных таблиц и дат вытаскивает дату в том же самом формате: yyyy-mm-dd.

Любопытно, отчего так?
И второе - как бы преобразовать из формата yyyy-mm-dd в формат dd.mm.yyyy на сервере?
Сейчас преобразование выглядит так (в ХП, например):
Код: plsql
1.
2.
    stdt = cast(:dt as varchar(10)); 
    stdt = RIGHT(stdt, 2)||'.'||SUBSTRING(stdt FROM 6 FOR 2)||'.'||SUBSTRING(stdt FROM 1 FOR 4);


А попроще нельзя ли?
...
Рейтинг: 0 / 0
Преобразование даты
    #38868674
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08FB 2.5, IBExpert, IBX.

Выдранная из таблицы представлением дата при запросе к нему (select * from view1) показывается в формате yyyy-mm-dd.
..........
Любопытно, отчего так?

Ну наверное кастится к строке
...
Рейтинг: 0 / 0
Преобразование даты
    #38868679
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, эксперимент показал, что так, но чего бы ему не кастится в другом формате?
...
Рейтинг: 0 / 0
Преобразование даты
    #38868683
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08А попроще нельзя ли?
Отображение данных - задача клиента, а не сервера. Как твои разные клиенты отображают дату - это вопрос к их создателям и настройкам ОС, но никак не к серверу. Соответственно, преобразовывать дату из формата в формат на сервере - тоже не самая лучшая идея.
...
Рейтинг: 0 / 0
Преобразование даты
    #38868684
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что клиент должен отвечать за отображение я понимаю, но вопрос больше о том, есть ли встроенная функция в сервере, с помощью которой можно преобразовать дату из одного формата в другой.
Есть, к примеру, запрос, где нужно сформировать составное поле из даты и наименования.
Для такой ситуации и пригодилась бы такая функция.
Получить в запросе значение не "2014-11-01, Якутск", а "01.11.2014, Якутск".
...
Рейтинг: 0 / 0
Преобразование даты
    #38868685
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Есть, к примеру, запрос, где нужно сформировать составное поле из даты и
наименования.
Не нужно. Сделать из двух полей одно это тоже задача клиента.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Преобразование даты
    #38868694
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам, наверное, было не нужно, а мне как раз надо.
Да и с каких пор составные поля в результатах запроса стало криминалом? (или всегда было, а я пропустил?)
Еще ситуация, в которой я бы не отказался от серверной функции преобразования даты (в строковом представлении, разумеется) из одного формата в другой, это когда на клиенте, в гриде в одной и той же колонке нужно отображать текстовое значение или дату в зависимости от условий в строке.
Но уже понятно, что функция такая из области фантазий.
Да ладно, через ХП можно.
...
Рейтинг: 0 / 0
Преобразование даты
    #38868705
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

10793328
...
Рейтинг: 0 / 0
Преобразование даты
    #38869376
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08) из одного формата в другой
на клиенте дата отображается в том формате, который задан в настройках системы на конкретном компьютере.
Уж сколько раз писали, что преобразование даты на сервере к какому-то жесткому формату может вызвать проблемы с интерпретацией этой даты на клиенте.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869452
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Для такой ситуации и пригодилась бы такая функция.
Получить в запросе значение не "2014-11-01, Якутск", а "01.11.2014, Якутск".

А если мне на клиенте понадобится совсем другой формат даты? С какого-то момента изменились требования у заказчика, к примеру. И мне придётся все старые записи обновлять, конвертируя из одного формата в другой на сервере, что не есть хорошо. Итог: это должны быть разные поля: дата и строка.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869530
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет "итога" никак не соглашусь. Предложение более чем странное.
Речь в теме идет не о способах хранения даты в базе, а отображении ее в удобоваримом для юзера виде. И только лишь.
А это можно сделать где угодно (на сервере или на клиенте) и в каком угодно формате.
Что касается изменений требований у заказчика (потребуется другой формат даты, к примеру), то в этом случае все равно придется переделывать: либо приложение, либо структуру в базе (ХП ли), либо то и другое.
Чем здесь поможет ваше предложение "иметь два поля"? Переделывать все равно придется.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869559
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

да, придётся. Только трудоёмкость будет разной. В случае отдельного хранения даты на сервере, мне не нужно преобразовывать старые значения полей в новые, просто на клиенте написать преобразование в новый формат.
Сортировка, ключ и индекс по полю типа дата будет совсем другой (гораздо легче), чем в случае составного поля.
Вообще, это моё личное мнение, я стараюсь не изменять данные в базе, потому как не я ввёл эти данные.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869563
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

и вам уже ответили, что отображение данных - это задача клиента. Со своей стороны я понял, что вы дату собираетесь хранить в строковом виде. Если был не прав, прощу прощения.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869566
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Речь в теме идет не о способах хранения даты в базе, а отображении ее в
удобоваримом для юзера виде. И только лишь.
А это можно сделать где угодно (на сервере или на клиенте) и в каком угодно формате.
Нет. Во-первых, на сервере пользователя нет, как нет и средств отображения. Во-вторых,
"какой угодно формат" не прокатит - пользователь определил формат в котором хочет
видеть данные при настройке своей системы. На сервере этой информации нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Преобразование даты
    #38869568
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45SAN_01_08,
да, придётся. Только трудоёмкость будет разной. В случае отдельного хранения даты на сервере, мне не нужно преобразовывать старые значения полей в новые, просто на клиенте написать преобразование в новый формат.
Сортировка, ключ и индекс по полю типа дата будет совсем другой (гораздо легче), чем в случае составного поля.
Вообще, это моё личное мнение, я стараюсь не изменять данные в базе, потому как не я ввёл эти данные.

А что кто-то говорил, что дата не хранится отдельно,
или речь шла о сортировке, индексах????

зы. по поводу
"просто на клиенте написать преобразование в новый формат"
точно так-же просто
на сервере написать преобразование в новый формат
(что для меня намного удобнее, но это моё личное мнение)
...
Рейтинг: 0 / 0
Преобразование даты
    #38869586
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Что клиент должен отвечать за отображение я понимаю, но вопрос больше о том, есть ли встроенная функция в сервере, с помощью которой можно преобразовать дату из одного формата в другой.
Есть, к примеру, запрос, где нужно сформировать составное поле из даты и наименования.
Для такой ситуации и пригодилась бы такая функция.
Получить в запросе значение не "2014-11-01, Якутск", а "01.11.2014, Якутск".

Чтобы не толочь воду в ступе. Встроенной функции Format в FB на данный момент нет (как минимум до версий 2.5.Х; насчет 3.0 не в курсе). Если очень надо - можно написать свою UDF, или поискать подходящую из уже существующих. При большом желании можно даже процедуру написать.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869591
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

в 3.0 тоже нет
...
Рейтинг: 0 / 0
Преобразование даты
    #38869597
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Я подозревал это, но поскольку c 3.0 еще не работал плотно, а здесь ты о новых встроенных функциях вообще не упоминал (что не значит что их нет), то решил вставить ремарку.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869621
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

Там изменений по большому счёту два:
1. Функция SUBSTRING может работать с регулярными выражениями. Это описано.
2. Появились гиперболические тригонометрические и обратные от них функции. Это не описано ввиду малозначимости. В LR будет конечно.

Но в FB3 можно написать свою PSQL функцию для форматирования, хотя она будет работать медленней чем UDF/UDR.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869693
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineПри большом желании можно даже процедуру написать.
При этом важный момент, что процедуру можно делать не универсальной. Количество форматов для даты/времени порядка 20 может вполне хватить. Жёстко вбить в код через if-ы и ошибка в случае промаха. Уже кучу лет так работает.
В 3.0 только вызов будет в стиле функции лаконичнее и проще.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869784
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТам изменений по большому счёту два
Понятно, спасибо.

afgmПри этом важный момент, что процедуру можно делать не универсальной. Количество форматов для даты/времени порядка 20 может вполне хватить. Жёстко вбить в код через if-ы и ошибка в случае промаха.
+1
...
Рейтинг: 0 / 0
Преобразование даты
    #38869849
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, количество форматов дат ограничено по определению. 20-ти вполне хватит за глаза, особенно для моноязычных приложений.
Но тема, скорее, поднята про возможности сервера.
К примеру, в MS SQL Server есть такая фича в виде дополнительного параметра к преобразователю:
convert(varchar, Date_Fact, 104)
"104" или другое какое число как раз и управляет выходным форматом даты.
Была этакая призрачная надежда, что и разработчики FB в эту сторону взглянут.
Ну, на "нет" и суда нет. Беда мизерная - другие возможности имеются.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869881
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08Ну да, количество форматов дат ограничено по определению. 20-ти вполне хватит за глаза, особенно для моноязычных приложений.
вы это, адекватны?
если дата хранится на сервере как дата, то, допустим, одно и то же приложение, запущенное на двух компьютерах, с разными форматами данных в системе, покажут одну и ту же дату например как
dd.mm.yyyy
mm/dd/yyyy
и никаких проблем при этом у приложений не будет. Вы вообще в настройки системы на тему даты заглядывали хоть раз?

О чем вам и говорят, что форматирование дату в строку на сервере, в фиксированный формат (любой), ведет лишь к проблемам на клиенте, и ни к чему более.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869883
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SAN_01_08,

я еще добавлю - уже сколько лет известна эта "проблема", но тем не менее люди все продолжают наступать на эти грабли, причем их упорство в этом просто удивительно.
...
Рейтинг: 0 / 0
Преобразование даты
    #38869900
SAN_01_08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторформатирование дату в строку на сервере, в фиксированный формат (любой), ведет лишь к проблемам на клиенте, и ни к чему более.
Думаю, вы немного погорячились. Для меня в этом отношении на клиенте никаких проблем никогда не возникало.
Зачем мне глядеть в настройки ОСи, если я вывожу дату так как мне (клиенту) надо, а не так как настроены региональные стандрты.
На них положись, так в иной ситуации костей не соберешь.
Да, я всегда преобразовываю дату в клиентском приложении и по-другому никогда не делал, но понадобилось в очень специфической ситуации заставить это сделать сервер.
Здесь, по правде, говорить то не о чем. Надо было лишь узнать есть такая функция в FB сервере; а нет, ну и бог с ней.
...
Рейтинг: 0 / 0
Преобразование даты
    #38870024
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvSAN_01_08Ну да, количество форматов дат ограничено по определению. 20-ти вполне хватит за глаза, особенно для моноязычных приложений.
вы это, адекватны?
если дата хранится на сервере как дата, то, допустим, одно и то же приложение, запущенное на двух компьютерах, с разными форматами данных в системе, покажут одну и ту же дату например как
dd.mm.yyyy
mm/dd/yyyy
и никаких проблем при этом у приложений не будет. Вы вообще в настройки системы на тему даты заглядывали хоть раз?

О чем вам и говорят, что форматирование дату в строку на сервере, в фиксированный формат (любой), ведет лишь к проблемам на клиенте, и ни к чему более.

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

зы. Ну как-то так просим сервер
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select format_date_rus(current_date,'d.mm.yy') from rdb$database
union all
select format_date_rus(current_date,'dd.mm.yy') from rdb$database
union all
select format_date_rus(current_date,'dd.mm.yyyy') from rdb$database
union all
select format_date_rus(current_date,'Сегодня d-й день mmmm месяца года yyyy от РХ') from rdb$database
union all
select format_date_rus(current_date,'Сегодня d-й день Mmmm месяца года yyyy от РХ') from rdb$database
union all
select format_date_rus(current_date,'Данные за mmmm yyyy года') from rdb$database


и что-то такое подучаем
3.02.15
03.02.15
03.02.2015
Сегодня 3-й день февраля месяца года 2015 от РХ
Сегодня 3-й день Февраля месяца года 2015 от РХ
Данные за февраль 2015 года
...
Рейтинг: 0 / 0
Преобразование даты
    #38870042
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mзы. Ну как-то так просим сервер
...
и что-то такое подучаем
...
хочется аналог этого?
select to_char(sysdate, 'DD.MM.YY')
from dual
union
select to_char(sysdate, 'DD.MM.YYYY')
from dual
union
select 'Сегодня '||to_char(sysdate, 'DD')||' день, '||to_char(sysdate, 'Month')||' месяц, '||to_char(sysdate, 'YYYY')||' год от РХ'
from dual
union
select 'Сегодня '||to_char(sysdate, 'DD')||' день, '||to_char(sysdate, 'month')||' месяц, '||to_char(sysdate, 'YYYY')||' год от РХ'
from dual

ЗЫ ну и на выходе
03.02.15
03.02.2015
Сегодня 03 день, Февраль месяц, 2015 год от РХ
Сегодня 03 день, февраль месяц, 2015 год от РХ
...
Рейтинг: 0 / 0
Преобразование даты
    #38870046
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если очень хочется, то можно и самому написать. Для экспорта напрямую в инородные форматы использую это. Делов-то на пару минут...

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
// JCL_DEBUG_EXPERT_GENERATEJDBG OFF
// JCL_DEBUG_EXPERT_INSERTJDBG OFF
{$DEFINE FREE_IT}
library wad_udf;

uses
  System.SysUtils,
  ib_util;

type
    PIBDateTime = ^TIBDateTime;
    TIBDateTime = record
        Days, // Date: Days since 17 November 1858
        MSec10: Integer; // Time: Millisecond * 10 since midnigth
    end;

const // константы трансляции даты:
    MSecsPerDay10 = MSecsPerDay * 10; // миллисекунд в сутках * 10
    IBDateDelta = 15018; // разница в днях между датами Delphi 2.0 и InterBase

function DateTimeToChar(var IBDateTime: TIBDateTime; sz: PAnsiChar): PAnsiChar; cdecl; export;
var d: TDateTime;
    u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    with IBDateTime do
        d := Days - IBDateDelta + MSec10 / MSecsPerDay10;
    u := FormatDateTime(UTF8String(sz), d, fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

function IntegerToChar(var iLong: integer; sz: PAnsiChar): PAnsiChar; cdecl; export;
var u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    u := Format(UTF8String(sz), [iLong], fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

function FloatToChar(var F: Double; sz: PAnsiChar): PAnsiChar; cdecl; export;
var u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    u := Format(UTF8String(sz), [F], fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

function FloatToChar2(var F: Double; sz: PAnsiChar): PAnsiChar; cdecl; export;
var u: UTF8String;
    fs: TFormatSettings;
begin
    fs := TFormatSettings.Create;
    u := FormatFloat(UTF8String(sz), F, fs);
    Result := ib_util_malloc(Length(u)+1);
    StrCopy(Result, PAnsiChar(u));
end;

{$R *.res}

exports
    IntegerToChar,
    FloatToChar,
    FloatToChar2,
    DateTimeToChar;

begin
    IsMultiThread := True;
end.

...
Рейтинг: 0 / 0
Преобразование даты
    #38870056
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv О чем вам и говорят, что форматирование дату в строку на сервере, в фиксированный формат (любой), ведет лишь к проблемам на клиенте, и ни к чему более.
Думаю речь идёт о форматировании даты при склейке с другим текстом (счета, отчёты, логи и пр.). Уж коли логика в хранимках, то и форматирование даты на сервер вполне допустимо.
А вот отдельные поля надо оставлять в формате даты времени и отдавать на откуп клиенту. Если ТС хочет форматировать отдельное поле, то критика тут вполне оправдана, либо у ТС-а есть очень веские причины так поступить (невозможность модификации целевой системы отображения информации, например)
...
Рейтинг: 0 / 0
Преобразование даты
    #38870209
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmлибо у ТС-а есть очень веские причины так поступить (невозможность модификации целевой системы отображения информации, например)судя по примерам хотения
m7mСегодня 3-й день Февраля месяца года 2015 от РХ
может быть система учёта ценностей музея или археологических находок, где значение поля может быть вроде "IV-V в.в. до н.э.", но тогда хранение даты как таковой для датирования возраста более чем сомнительно.
...
Рейтинг: 0 / 0
Преобразование даты
    #38870244
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterafgmлибо у ТС-а есть очень веские причины так поступить (невозможность модификации целевой системы отображения информации, например)судя по примерам хотения
m7mСегодня 3-й день Февраля месяца года 2015 от РХ
может быть система учёта ценностей музея или археологических находок, где значение поля может быть вроде "IV-V в.в. до н.э.", но тогда хранение даты как таковой для датирования возраста более чем сомнительно.
У ТС что не знаю, а у меня просто примеры реализации.
По поводу "Сегодня 3-й день Февраля месяца года 2015 от РХ"
ну просто захотелось похвастаться показать что эта реализация может.
зы. она также понимает день недели, квартал, часы, минуты и секунды
...
Рейтинг: 0 / 0
Преобразование даты
    #38870276
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mУ ТС что не знаю, а у меня просто примеры реализации.я невнимательно читал топик, извиняюсь, спутал с ТС.
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Преобразование даты
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]