IBM iSeries 组合日期和时间小数字段以比较当前时间
IBM iSeries Combine Date & Time decimal fields to compare current time
我在 IBM iSeries 中工作,其中日期和时间分别存储为十进制、8 和 6 个字符,('YYYYMMDD') 和 123456
我已经能够在单独的列中得出当前日期和时间。然后是两个时间戳的最新日期和时间,只有当一条记录被操作不止一次时,才会记录第二个日期和时间。
我正在努力将组合的最新 date/time 时间戳与当前时间进行比较,以确定经过的时间量(最好以分钟为单位),时间戳通常在午夜过后。
Select
(SELECT 当前日期来自 sysibm.sysdummy1)"Current Date",
(SELECT 当前时间来自 sysibm.sysdummy1) "Current Time",
char(日期(
substr(MAX(Date1,Date2),1,4) || '-'||
substr(MAX(Date1,Date2),5,2) || '-'||
substr(MAX(Date1,Date2),7,2)), 美国) "Last View Date",
Case When MAX(Date1,Date2)=Date2 then Time2/86400 else Time1/86400 end "Last Time"
来自......
您需要将日期和时间数字字段转换为单个时间戳字段。我们的时间戳格式是 "YYYY-MM-DD-hh.mm.ss".
Select timestamp(substr(digits(date1),1,4) ||'-'||
substr(digits(date1),5,2) ||'-'||
substr(digits(date1),7,2) ||'-'||
substr(digits(time1),1,2) ||'.'||
substr(digits(time1),3,2) ||'.'||
substr(digits(time1),5,2)) as Timestamp1
from ...
注意使用 DIGITS 而不是 CHAR,所以我们得到前导零。
然后您可以使用 TimestampDiff() 函数来确定两者之间的分钟数。 TimestampDiff() 函数有两个参数。第一个是一个整数,告诉它您需要哪个时间单位(秒、分钟、小时、天等)。第二个是将转换为字符的两个日期相减。我不知道为什么它不能只取两个时间戳,但 IBM 就是这样给我们的。这是一个例子。
Select TimestampDiff(4, Char(Current_Timestamp-
timestamp(substr(digits(date1),1,4) ||'-'||
substr(digits(date1),5,2) ||'-'||
substr(digits(date1),7,2) ||'-'||
substr(digits(time1),1,2) ||'.'||
substr(digits(time1),3,2) ||'.'||
substr(digits(time1),5,2)))) as HoursDiff
from ...
当然,这将处理任何午夜后的日期翻转。 TimestampDiff() 中第一个参数的值为:
1 = Microseconds
2 = Seconds
4 = Minutes
8 = Hours
16 = Days
32 = Weeks
64 = Months
128 = Years
我在 IBM iSeries 中工作,其中日期和时间分别存储为十进制、8 和 6 个字符,('YYYYMMDD') 和 123456
我已经能够在单独的列中得出当前日期和时间。然后是两个时间戳的最新日期和时间,只有当一条记录被操作不止一次时,才会记录第二个日期和时间。
我正在努力将组合的最新 date/time 时间戳与当前时间进行比较,以确定经过的时间量(最好以分钟为单位),时间戳通常在午夜过后。
Select (SELECT 当前日期来自 sysibm.sysdummy1)"Current Date", (SELECT 当前时间来自 sysibm.sysdummy1) "Current Time",
char(日期(
substr(MAX(Date1,Date2),1,4) || '-'||
substr(MAX(Date1,Date2),5,2) || '-'||
substr(MAX(Date1,Date2),7,2)), 美国) "Last View Date",
Case When MAX(Date1,Date2)=Date2 then Time2/86400 else Time1/86400 end "Last Time"
来自......
您需要将日期和时间数字字段转换为单个时间戳字段。我们的时间戳格式是 "YYYY-MM-DD-hh.mm.ss".
Select timestamp(substr(digits(date1),1,4) ||'-'||
substr(digits(date1),5,2) ||'-'||
substr(digits(date1),7,2) ||'-'||
substr(digits(time1),1,2) ||'.'||
substr(digits(time1),3,2) ||'.'||
substr(digits(time1),5,2)) as Timestamp1
from ...
注意使用 DIGITS 而不是 CHAR,所以我们得到前导零。
然后您可以使用 TimestampDiff() 函数来确定两者之间的分钟数。 TimestampDiff() 函数有两个参数。第一个是一个整数,告诉它您需要哪个时间单位(秒、分钟、小时、天等)。第二个是将转换为字符的两个日期相减。我不知道为什么它不能只取两个时间戳,但 IBM 就是这样给我们的。这是一个例子。
Select TimestampDiff(4, Char(Current_Timestamp-
timestamp(substr(digits(date1),1,4) ||'-'||
substr(digits(date1),5,2) ||'-'||
substr(digits(date1),7,2) ||'-'||
substr(digits(time1),1,2) ||'.'||
substr(digits(time1),3,2) ||'.'||
substr(digits(time1),5,2)))) as HoursDiff
from ...
当然,这将处理任何午夜后的日期翻转。 TimestampDiff() 中第一个参数的值为:
1 = Microseconds
2 = Seconds
4 = Minutes
8 = Hours
16 = Days
32 = Weeks
64 = Months
128 = Years