Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql AS400/DB2-将基于整数的日期和时间转换为时间戳?_Sql_Ibm Midrange - Fatal编程技术网

Sql AS400/DB2-将基于整数的日期和时间转换为时间戳?

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

我有4条用户输入:
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被错误地认为是闰年。