【问题标题】:Cast Date in InformixInformix 中的演员表日期
【发布时间】:2009-10-12 17:49:21
【问题描述】:

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

这仍然没有返回任何数据。

有什么想法吗?

【问题讨论】:

    标签: datetime casting informix


    【解决方案1】:

    Informix DATE 格式

    请注意,日期 1899-12-31 对应于零 (0) 的内部日期表示。也就是说,在内部,Informix 将 DATE 值存储在一个 4 字节整数中,并计算自 1899 年 12 月 31 日以来的天数,因此第 1 天是 1900 年 1 月 1 日(因为它知道 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 转换为字符串时)。


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

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

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

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


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

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

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

      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 表示法,除了一些旧版本不支持它 - 尽管你必须使用非常旧的版本才能成为问题。

    【讨论】:

    • 有些日期从 1899 年开始是有原因的,我相信原因是为了解决 y2k 问题。您是说即使它不是真正的 dateTime 日期类型,我也不需要强制转换此列?所以表达式“TODAY-365”和“TODAY”应该返回当前日期后 365 天内的所有数据,对吗?如何确定数据类型是什么?
    • @Neil:你可能不需要投射它; IDS 非常擅长为您转换,尤其是字符串到其他类型。您的DATE(vis_mod_dt) 调用并非严格意义上的强制转换(即CAST(vis_mod_dt AS DATE)vis_mod_dt::DATE),但它是在向IDS 添加显式强制转换之前的转换函数。确定数据类型的最简单方法是运行 DB-Schema,如我的回答中所建议的那样。下一个最简单的方法是使用 DB-Access,选择数据库,然后使用表格菜单和信息选项来查找列类型。请阅读我的答案的结尾,了解还需要什么。
    • 这有点令人困惑,因为当我运行以下命令时,我会得到数据: select count(*) from visit where vis_mod_dt between "10/01/2008" and "10/01/2009"
    • 谢谢,当我运行表模式选择语句时,我得到了 vis_mod_date 的 ColType 7,根据 IBM Informix 文档,这是一个 Date 数据类型。下一个问题,TODAY 函数是在更高版本的 Informix 中引入的吗?在 MS SQL Server 中,当我运行以下命令时,我得到了当前日期:选择 GetDate() 但是当我在 Informix 中运行以下命令时,出现语法错误:选择今天或选择今天()或选择今天 -365 谢谢!跨度>
    • 实际上,当我运行 SELECT TODAY, TODAY-365 FROM "informix".systables WHERE tabid = 1;我得到两个(表达式)列,10/13/1981 和 10/13/1980
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 2018-05-29
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多