Datetime Informix中的转换日期
我以前从未使用过Informix,我正在尝试编写一个查询,该查询将返回过去365天的记录 以下是我一直尝试使用的查询: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
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版。 如果这里的内容没有帮助,我建议编辑您的问题,包括:
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,选择数据库,然后使用“表”菜单和“信息”选项查找