Sql AS400/DB2-将基于整数的日期和时间转换为时间戳?
我有4条用户输入:Sql AS400/DB2-将基于整数的日期和时间转换为时间戳?,sql,ibm-midrange,Sql,Ibm Midrange,我有4条用户输入:startDate,endDate,startTime,endTime 数据库中的日期和时间设置与我以前使用的任何设置都不同。日期是自1900年12月31日以来的天数。所以是一个整数。例如,2015年10月16日将被表示为41927 时间是ISO格式的-没有小数,所以也是整数。所以08:00:00就是80000。19:00:00将是190000。它基本上是HHMMS,但有时你只有一个h 我正在尝试将日期和时间过滤到范围中。有一天,我只是在看《泰晤士报》,这很好: SELECT
startDate
,endDate
,startTime
,endTime
数据库中的日期和时间设置与我以前使用的任何设置都不同。日期是自1900年12月31日以来的天数。所以是一个整数。例如,2015年10月16日将被表示为41927
时间是ISO格式的-没有小数,所以也是整数。所以08:00:00就是80000。19:00:00将是190000。它基本上是HHMMS,但有时你只有一个h
我正在尝试将日期和时间过滤到范围中。有一天,我只是在看《泰晤士报》,这很好:
SELECT * FROM database WHERE day = 41927 AND time > startTime and time < endTime
从数据库中选择*,其中day=41927和time>startTime和time
如果您严格关注天数,它也会起作用:
SELECT * FROM database WHERE day > startDate AND day < endDate
从日期>开始日期和日期<结束日期的数据库中选择*
当您需要查找两次两个日期之间的项目时,就会出现问题,因为它会过滤掉每天不在这两次之间的任何内容。我知道有一种方法可以创建时间戳,但我很难在查询中使用两个整数将其组合在一起
我需要什么样的选项来解决这个问题?您可以将其与简单的算术结合使用:
select date('1900-12-31') + col days
然而,我怀疑真正的开始日期是1899-12-31。这是Excel使用的日期(因此第一天是1900-01-01)
编辑:
哎呀,把秒数漏掉了。一种方法是:
select timestamp(date('1900-12-31') + coldays days) +
(floor(coltime / 10000) * 60*60 +
mod(floor(coltime / 100)) * 60
mod(coltime, 100)
) seconds
您可以将其与简单的算术结合使用:
select date('1900-12-31') + col days
然而,我怀疑真正的开始日期是1899-12-31。这是Excel使用的日期(因此第一天是1900-01-01)
编辑:
哎呀,把秒数漏掉了。一种方法是:
select timestamp(date('1900-12-31') + coldays days) +
(floor(coltime / 10000) * 60*60 +
mod(floor(coltime / 100)) * 60
mod(coltime, 100)
) seconds
虽然你有一个有效的答案(来自你的评论) 2) 在旧版本中,您可能希望将传入的时间戳转换为部分,并进行如下比较:
select * from mytable
where (strdays < coldays
or strdays = coldays and strtime <= coltime)
and (enddays > coldays
or enddays = coldays and endtime >= coltime)
虽然你有一个有效的答案(来自你的评论) 2) 在旧版本中,您可能希望将传入的时间戳转换为部分,并进行如下比较:
select * from mytable
where (strdays < coldays
or strdays = coldays and strtime <= coltime)
and (enddays > coldays
or enddays = coldays and endtime >= coltime)
很好,这解决了白天的问题,唯一的问题是秒。它们实际上不是以秒为单位的——它们是没有小数的ISO格式。07:00是25200秒,但我的格式是“70000”。我想最好的办法是把它分解成各自的数字,然后进行乘法运算。不管出于什么原因,原点时间实际上是1900-12-31,我不知道为什么会这样设置!如果其他人遇到这种情况,只需要几个小语法:选择时间戳(date('1900-12-31')+coldays天)+(floor(coltime/10000)*60*60+mod(floor(coltime/100),100)*60 mod(coltime,100))seconds@Kiresays . . . 我修正了逻辑。谢谢。毫无疑问,选择1900-12-31是为了避开著名的“Excel日期错误”(从Lotus 1-2-3继承而来),其中1900被错误地认为是闰年。好吧,很好,解决了天,唯一的问题是秒。它们实际上不是以秒为单位的——它们是没有小数的ISO格式。07:00是25200秒,但我的格式是“70000”。我想最好的办法是把它分解成各自的数字,然后进行乘法运算。不管出于什么原因,原点时间实际上是1900-12-31,我不知道为什么会这样设置!如果其他人遇到这种情况,只需要几个小语法:选择时间戳(date('1900-12-31')+coldays天)+(floor(coltime/10000)*60*60+mod(floor(coltime/100),100)*60 mod(coltime,100))seconds@Kiresays . . . 我修正了逻辑。谢谢。毫无疑问,选择1900-12-31是为了避开著名的“Excel日期错误”(继承自Lotus 1-2-3),其中1900被错误地认为是闰年。