Firebird sql удаляет миллисекунды из запроса - PullRequest
1 голос
/ 14 марта 2019

Итак, у меня есть запрос:

SELECT FD_DATUM_INGEVOERD || ' ' || FT_TIJD_INGEVOERD 
FROM BANDZENDINGEN

, который объединяет столбец даты со столбцом времени, но я получаю такой результат:

enter image description here

Как вы можете видеть, я получаю миллисекунды, но в исходном столбце нет отставания от времени:

   SELECT FT_TIJD_INGEVOERD FROM BANDZENDINGEN

enter image description here

Почему это происходит?и что я могу сделать, чтобы удалить миллисекунды?

Ответы [ 3 ]

1 голос
/ 14 марта 2019

Решил проблему в моем php файле:

   $dateArr = array();
   $date = $sfm->fetchAll(PDO::FETCH_COLUMN, 0);

   foreach ($date as $row)
   {
      $new_date = date("Y-m-d h:i:s", strtotime($row));
      array_push($dateArr, $new_date);
   }
0 голосов
/ 16 марта 2019

Когда вы запрашиваете только время, преобразование в строку выполняется клиентским приложением.Здесь это, очевидно, не включает в себя вторую частьКогда вы объединяете значение времени в строку, он использует зависящее от локали преобразование на сервере, которое включает в себя подсекундную часть (это также может зависеть от локали!).

Существует несколько возможных решений

  1. Не выполнять конкатенацию, а форматировать на стороне клиента
    • Вместо объединения даты и времени в виде строки используйте сложение, чтобы сформировать метку времени, а затем отформатировать на стороне клиента
    • Не используйте отдельные поля, кроме одного поля отметки времени, а затем форматируйте на стороне клиента.
  2. Используйте функции управления строками
    • LEFT: LEFT(FD_DATUM_INGEVOERD || ' ' || FT_TIJD_INGEVOERD, 19)
    • SUBSTRING: SUBSTRING(FD_DATUM_INGEVOERD || ' ' || FT_TIJD_INGEVOERD FROM 1 FOR 19)
    • SUBSTRING с регулярным выражением SQL (Firebird 3), но это действительно такздесь перебор

Форматирование на стороне клиента - почти всегда лучший выбор.

0 голосов
/ 15 марта 2019

Если вы используете дату типа для FD_DATUM_INGEVOERD и время ввода для FT_TIJD_INGEVOERD

, вы можете сделать что-то подобное

select 
cast(FD_DATUM_INGEVOERD as date)||' '||substring(cast(FT_TIJD_INGEVOERD as time) from 1 for 8) 
FROM BANDZENDINGEN
...