1

我以前从未使用过 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;

这仍然不返回任何数据。

有任何想法吗?

4

3 回答 3

3

Informix 日期格式

请注意,日期 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/

这表示日期由日、月、4 位数年份组成,并且“/”用作首选分隔符。对于美国格式,假定的默认值通常是“MDY4/”,您不会感到惊讶;我习惯使用“Y4MD-”,所以我看到 DATE 值与 DATETIME YEAR TO DAY 相同,这是日期的 ISO 8601:2004 表示法。(它有很多好处:它是明确的,并且幼稚的排序算法将这些日期排序为日期顺序。)实际上在 IDS 的背景中有很多机制(IBM Informix Dynamic Server - 我假设它是你的 DBMS使用;有一些替代方案也是 Informix DBMS),这样具有 2 位日期的字符串通常会被正确转换(但它们是模棱两可且不可取的),以及除 '/' 之外的分隔符


改进此问题答案所需的信息 - 第 1

如果这里的内容没有帮助,那么我建议您编辑您的问题以包括:

  1. 表架构。
  2. 您认为应该选择但没有选择的几 (2-4) 行数据。
  3. 平台和版本信息。将版本降低到 IDS 11.50.FC4W1 的详细程度会有所帮助;有时这很重要。当然,最常见的是前三位数字会影响事物。

如果您的表很大(很多列),请尝试选择关键列(vis_mod_dt迄今为止最重要的列)。理想情况下,显示屏中不需要任何滚动条。确保您不包含任何敏感信息。


改进此问题答案所需的信息 - 第2

如果你注意我问你的问题,我会帮助你。如果您不注意我提出的问题,我无法帮助您。请编辑您的问题,而不是添加信息作为“答案”。

  • 什么是表架构?输出是什么:

    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?
  • 你在哪个平台上使用它?
  • 您使用哪种语言或工具来运行查询。

注意:如果您不能复制'n'粘贴上面的查询,那么您可能不需要包含引用的 '"informix"。系统目录上的属性;但是,正如所写,查询将在任何现存的 Informix 数据库上工作 - OnLine 5.x、SE 5.x 或 7.x、IDS 7.x、XPS 8.x、IDS 9.x 或 10.x 或 11。 x - 以及任何数据库模式(未记录、记录、MODE ANSI)。我会使用 JOIN 表示法,除了一些旧版本不支持它 - 尽管你必须使用非常旧的版本才能成为问题。

于 2009-10-12T19:18:38.253 回答
0

这有点令人困惑,因为当我运行以下命令时,我得到了数据:

选择 count(*) from visit where vis_mod_dt between "10/01/2008" 和 "10/01/2009"

于 2009-10-13T13:20:12.597 回答
0

如何将表卸载到 ascii 文件,检查卸载的 vis_mod_dt 值以查看它们是否符合 DBDATE=MDY4 (mmddyyyy) 格式?.. 如果它们符合,如果它不是 DATE 列,则将 vis_mod_dt 更改为 TYPE DATE,然后加载卸载的表回来。

您的 SELECT 语句中的“BETWEEN today-365 AND today”部分适用于我的应用程序。

于 2010-02-27T23:48:51.357 回答