2012-05-28 136 views
10

我在DB2表中有一个DB2 DATE类型字段。 我想通过日期筛选器选择数据。例如:比较DB2日期

SELECT * 
FROM table 
WHERE registrationdate > '2002-10-01'; 

从上面的查询中,我从'1943-10-01'获得记录,但是这是不正确的。

这些不工作,要么:

registrationdate > date('2002-10-01') 
date(registrationdate) > date('2002-10-01') 
date(registrationdate) > '2002-10-01' 

如何,我需要比较日期?

+1

如何被定义的 “registrationdate” 列?也许列数据类型不是日期,如果是,那么你的原始查询应该已经工作。 – NealB

回答

3

我探讨一些其他的问题,数据库,重新启动后,它开始工作,所以这现在正常工作:

registrationdate > '2002-10-01' 
13

字面一个DATE SQL标准格式为:

DATE '2002-10-01' 

最起码,这是值得尝试:

SELECT * 
    FROM table 
WHERE registrationdate > DATE '2002-10-01'; 
+0

如果registrationdate被定义为时间戳,只是说时间戳'2012-12-21' – fedvasu

0

使用此格式。

registrationdate > 'mm/dd/yyyy' 
+0

假设'registrationDate'是一个日期类型,更改格式将不起作用。如果它类似于char类型,则这个**将不起作用全部** - 您选择的格式不能很好地排序。由于某种原因,ISO是标准推荐格式。 –

3

用于日期的默认格式是由DB2数据库的地域代码(其可以在创建数据库时指定)确定。例如,我的数据库是使用territory = US创建的。因此日期格式如下所示:

values current date 
1 
---------- 
05/30/2003 

1 record(s) selected. 

您可能会从DB CFG获取地区代码。

db2 get db cfg | egrep 'code|territory' 
Database territory          = US 
Database code page          = 1208 
Database code set          = UTF-8 
Database country/region code       = 1 

即,格式为MM/DD/YYYY。如果要更改格式,可以将db2实用程序包的集合绑定为使用不同的日期格式。

要使用SQL获得当前的日期,时间和时间戳,(基本上给你的日期格式是什么样的想法)引用适当的DB2寄存器: 的SYSIBM.SYSDUMMY1表是一种特殊的内存可以用来发现DB2的值表登记

db2 "SELECT current date FROM sysibm.sysdummy1 " 

1 
---------- 
06/02/2014 

    1 record(s) selected. 

,如果我们离开了在功能上引号的日期功能仍然有效,甚至,但结果是不正确的:

db2 "SELECT date(2001-09-22) FROM sysibm.sysdummy1 " 

1 
---------- 
05/24/0006 

    1 record(s) selected. 

当DATE函数获取字符串作为输入时,它假定它是DB2日期的有效字符表示形式,并相应地转换它。相反,当输入是数字时,函数假定它代表从当前时代开始(即0001-01-01)开始减去一天的天数。在上面的查询中,输入是2001-09-22,等于(2001-9)-22,等于1970天。

如果以上所有条件都适用,下面的命令应该适用于您的问题。

SELECT * FROM table WHERE registrationdate > '10/01/2002';