Informix中的投射日期

时间:2009-10-12 17:49:21

标签: datetime casting informix

我之前从未使用过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 个答案:

答案 0 :(得分:2)

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/

这表示日期包括日期,月份,4位数年份,“/”用作首选分隔符。对于美国格式,假设默认值通常为“MDY4 /”,您不会感到惊讶;我习惯性地使用'Y4MD-',因此我看到DATE值与DATETIME YEAR TO DAY相同,这是日期的ISO 8601:2004表示法。 (它有很多好处:它是明确的,天真的排序算法将这些日期排序为日期顺序。)IDS背景中实际上有很多机制(IBM Informix Dynamic Server - 我认为,这是你的DBMS使用;还有一些替代品也是Informix DBMS),这样通常可以正确转换具有2位数日期的字符串(但它们是不明确的和不合需要的),并且在输入时将识别除“/”之外的分隔符,但是斜杠将用于'输出'(将DATE转换为字符串时)。


改善这个问题答案所需的信息 - 1 st Edition。

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

  1. 表架构。
  2. 您认为应该选择但不是的几(2-4)行数据。
  3. 平台和版本信息。它可以帮助将版本降低到IDS 11.50.FC4W1的详细程度;偶尔它很重要。最常见的是,前三位数是影响事物的因素。
  4. 如果您的表很大(很多列),请尝试选择关键列(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?
    • 您在哪个平台上使用它?
    • 您使用哪种语言或工具来运行查询。

    注意:如果你不能复制'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表示法,除了一些旧版本不支持它 - 虽然你必须在非常旧的版本上才能成为一个问题。

答案 1 :(得分:0)

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

从“10/01/2008”和“10/01/2009”之间的vis_mod_dt访问中选择计数(*)

答案 2 :(得分:0)

如何将表卸载到ascii文件,检查卸载的vis_mod_dt值以查看它们是否符合DBDATE = MDY4(mmddyyyy)格式?如果是,如果它不是DATE列,则ALTER vis_mod_dt为TYPE DATE,则重新加载已卸载的表。

:“BETWEEN今天-365和今天”SELECT语句的一部分适用于我的应用程序。