14

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

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'

我如何需要比较日期?

4

4 回答 4

19

DATE 文字的 SQL 标准格式是:

DATE '2002-10-01'

至少,值得一试:

SELECT *
  FROM table
 WHERE registrationdate > DATE '2002-10-01';
于 2012-05-28T17:17:05.587 回答
6

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

registrationdate > '2002-10-01'
于 2012-05-29T11:06:34.547 回答
4

用于日期的默认格式由DB2数据库的地区代码确定(可以在创建数据库时指定)。例如,我的数据库是使用 region=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.

即使我们在函数中省略引号,DATE 函数仍然有效,但结果不正确:

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';

于 2014-06-02T13:32:04.973 回答
1

使用这种格式。

registrationdate > 'mm/dd/yyyy'
于 2013-12-27T06:51:44.050 回答