Datetime Informix中的转换日期

Datetime Informix中的转换日期,datetime,casting,informix,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

我以前从未使用过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;
这仍然不会返回任何数据

有什么想法吗?

Informix日期格式 请注意,日期1899-12-31对应于零(0)的内部日期表示。也就是说,在内部,Informix以4字节整数存储日期值,并统计自1899-12-31以来的天数,因此第1天是1900-01-01(并且因为它知道1900不是闰年,所以第60天是1900-03-01)

这个事实让我担心你桌上有什么。但是,如果表中的数据不能根据请求转换为日期,通常会出现错误

您的表模式是什么? 您最好使用DB Access和Info/Tables选项或使用DB schema建立模式:

dbschema -d dbase -t visit
DB模式输出更适合添加到问题中

如果有数据可供选择,则使用“TODAY-365”和“TODAY”的查询表达式应该可以正常工作

DBDATE环境变量 有一个环境变量DBDATE,您可能需要对其进行设置以使其正常工作—将字符串表示形式转换为日期。由于您可能位于英国(从您的图标),因此您可能需要将DBDATE的值设置为:

export DBDATE=DMY4/
这就是说,日期由天、月、4位数的年组成,并且“/”用作首选分隔符。对于US格式,假定的默认值通常为“MDY4/”,您不会感到惊讶;我习惯使用“Y4MD-”,因此我看到的日期值与DATETIME YEAR TO DAY相同,这是ISO 8601:2004对日期的表示法。(它有很多好处:它是明确的,并且简单的排序算法将这些日期按日期顺序排序。)IDS(IBM Informix Dynamic Server,我假设它是您正在使用的DBMS,实际上在后台有很多机制;也有一些备选方案是Informix DBMS)这样,具有两位数日期的字符串通常可以正确转换(但它们是不明确的和不受欢迎的),并且在输入时可以识别“/”以外的分隔符,但在“输出”时(将日期转换为字符串时)将使用斜杠


改进此问题答案所需的信息-第1版。 如果这里的内容没有帮助,我建议编辑您的问题,包括:

  • 表架构
  • 您认为应该选择但没有选择的几(2-4)行数据
  • 平台和版本信息。它可以帮助将版本降低到IDS 11.50.FC4W1的详细级别;有时候这很重要。当然,最常见的情况是,前三位数字是影响事物的因素
  • 如果您的表很大(很多列),请尝试选择关键列(
    vis_mod_dt
    是目前最重要的一列)。理想情况下,显示器中不需要任何滚动条。 确保不包含任何敏感信息


    改进此问题答案所需的信息-第二版 如果你注意我问你的问题,我会帮助你的。如果你不注意我提出的问题,我就帮不了你。请编辑您的问题,而不是添加信息作为“答案”

    • 什么是表模式?以下各项的输出是什么:

      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\u LOCALE或DB\u LOCALE?如果是,他们的价值观是什么
    • 您正在使用哪个版本的Informix
    • 你在哪个平台上使用它
    • 您使用哪种语言或工具运行查询

    注意:如果无法复制“n”粘贴上述查询,则可能不需要在系统目录中包含引用的“informix.”属性;然而,正如所写的,查询将在任何现存的Informix数据库上工作——在线5.x、SE 5.x或7.x、IDS 7.x、XPS 8.x、IDS 9.x或10.x或11.x——以及任何数据库模式(未标记、记录、ANSI模式)。除了一些旧版本不支持连接符号外,我会使用连接符号,尽管您必须使用非常旧的版本才能成为问题。

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


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

    将表格卸载到ascii文件如何,检查卸载的vis_mod_dt值是否符合DBDATE=MDY4(mmddyyyy)格式?。。如果是,则将vis_mod_dt改为键入DATE(如果不是日期列),然后将卸载的表重新加载


    在我的应用程序中,SELECT语句中的“今日至365日”部分对我有效

    有些日期是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,选择数据库,然后使用“表”菜单和“信息”选项查找