Дата приведения в Informix - PullRequest
1 голос
/ 12 октября 2009

Я никогда не использовал Informix раньше, и я пытаюсь написать запрос, который будет возвращать записи за последние 365 дней.

Вот запрос, который я пытался использовать:

Select * from Visit where vis_mod_dt between today-365 and today;

Это не возвращает никаких записей, хотя я знаю, что есть данные за последние 365 дней. Я предполагаю, что vis_mod_dt не в столбце с истинной датой, хотя он отображается как '12/31/1899'. Я пытался привести этот столбец, используя:

select * from visit where date(vis_mod_dt) between today-365 and today;

Это все еще не возвращает данных.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 12 октября 2009

Informix DATE формат

Имейте в виду, что дата 1899-12-31 соответствует внутреннему представлению даты, равному нулю (0). То есть внутренне Informix хранит значения DATE в 4-байтовом целом числе и подсчитывает количество дней с 1899-12-31, поэтому День 1 был 1900-01-01 (и поскольку он знает, что 1900 не был високосным годом День 60 был 1900-03-01).

Этот факт заставляет меня беспокоиться о том, что у вас на столе. Однако, если данные в вашей таблице не могут быть преобразованы в DATE по запросу, обычно вы получите сообщение об ошибке.

Какая у вас схема таблицы?

Было бы целесообразно установить схему либо с помощью DB-Access и опции Info / Tables, либо с помощью DB-Schema:

dbschema -d dbase -t visit

Вывод DB-Schema больше подходит для добавления к вашему вопросу.

Выражения запроса, использующие 'TODAY-365' и 'TODAY', должны работать нормально - если есть данные для выбора.

Переменная среды DBDATE

Существует переменная окружения DBDATE, которую вам может потребоваться установить, чтобы заставить вещи работать - для преобразования строкового представления в даты. Поскольку вы, вероятно, проживаете в Великобритании (с вашего значка), вам может потребоваться установить для DBDATE значение:

export DBDATE=DMY4/

Это говорит о том, что даты состоят из дня, месяца, четырехзначного года, а «/» используется в качестве предпочтительного разделителя. Вы не будете удивлены, узнав, что предполагаемое значение по умолчанию обычно равно MDY4 /, для формата США; Я обычно использую 'Y4MD-', поэтому я вижу значение DATE таким же, как и DATETIME YEAR TO DAY, что является обозначением ISO 8601: 2004 для даты. (У этого есть много преимуществ: это однозначно, и наивные алгоритмы сортировки сортируют такие даты по порядку дат.) На самом деле в IDS есть много механизмов в фоновом режиме (IBM Informix Dynamic Server - который, я полагаю, является той СУБД, которой вы являетесь использование; есть некоторые альтернативы, которые также являются СУБД Informix), такие, что строки с двузначными датами обычно будут преобразованы правильно (но они неоднозначны и нежелательны), и разделители, отличные от '/', будут распознаваться при вводе, но косая черта будет использоваться на выходе (при преобразовании DATE в строку).


Информация, необходимая для улучшения ответа на этот вопрос - 1 st Edition.

Если то, что здесь не помогло, то рекомендую отредактировать ваш вопрос, включив в него:

  1. Схема таблицы.
  2. Несколько (2-4) строк данных, которые, по вашему мнению, должны быть выбраны, но не выделены.
  3. Информация о платформе и версии. Это может помочь снизить версию до уровня детализации IDS 11.50.FC4W1; иногда это имеет значение. Чаще всего, конечно, первые три цифры влияют на вещи.

Если ваша таблица большая (много столбцов), попробуйте выбрать ключевые столбцы (vis_mod_dt, безусловно, самый важный). В идеале, вам не понадобятся полосы прокрутки на дисплее. Убедитесь, что вы не включили конфиденциальную информацию.


Информация, необходимая для улучшения ответа на этот вопрос - 2 nd Edition

Я помогу вам, если вы обратите внимание на вопросы, которые я вам задаю. Я не могу помочь вам, если вы не обращаете внимание на вопросы, которые я задаю. И, пожалуйста, отредактируйте свой вопрос, а не добавляйте информацию в качестве «ответа».

  • Что такое схема таблицы? Из чего получается:

    SELECT t.tabid, t.tabname, c.colno, c.colname, c.coltype, c.collength
      FROM "informix".systables AS t, "informix".syscolumns AS c
     WHERE t.tabid = c.tabid
       AND t.tabname = "visit"
     ORDER BY t.tabid, c.colno;
    
  • Что вы получаете от:

    SELECT TODAY, TODAY-365 FROM "informix".systables WHERE tabid = 1;
    
  • У вас установлена ​​переменная окружения DBDATE? Если да, то какова его стоимость?

  • У вас установлены переменные окружения CLIENT_LOCALE или DB_LOCALE? Если да, то каковы их значения?
  • Какую версию Informix вы используете?
  • На какой платформе вы его используете?
  • Какой язык или инструмент вы используете для выполнения запроса.

Примечание: если вы не можете копировать и вставлять запросы выше, то вам, вероятно, не нужно указывать процитированный «informix». атрибуты в системном каталоге; однако, как написано, запросы будут работать с любой существующей базой данных Informix - OnLine 5.x, SE 5.x или 7.x, IDS 7.x, XPS 8.x, IDS 9.x или 10.x или 11. х - и любой режим базы данных (незарегистрированный, зарегистрированный, режим ANSI). Я бы использовал нотацию JOIN, за исключением того, что некоторые старые версии не поддерживают ее - хотя для того, чтобы это стало проблемой, вам нужно использовать очень старые версии.

0 голосов
/ 28 февраля 2010

как насчет выгрузки таблицы в файл ascii, проверьте выгруженные значения vis_mod_dt, чтобы увидеть, соответствуют ли они формату DBDATE = MDY4 (mmddyyyy)? .. если они это делают, ALTER vis_mod_dt в TYPE DATE, если это не столбец DATE, ЗАГРУЗИТЕ выгруженную таблицу обратно в.

часть: «Между сегодняшним днем ​​- 365 И сегодня» часть вашего утверждения SELECT работает для меня в моих приложениях.

0 голосов
/ 13 октября 2009

Это немного сбивает с толку, потому что когда я запускаю следующее, я получаю данные:

выберите количество (*) от посещения, где vis_mod_dt между «10/01/2008» и «10/01/2009»

...