根据单独的日期和时间int创建时间戳

时间:2018-07-06 10:35:31

标签: sap sybase amos

我正在尝试从数据库表中的字段创建从-到datetime的范围。

不幸的是,没有将字段保存为时间戳。

我有两个条目 -从午夜开始的小时数 -1970年1月1日起的日期

是否有命令组合这些条目,以便我可以使用select语句并在一定时间范围内进行搜索?

我的数据库是sybase 15.7

4 个答案:

答案 0 :(得分:0)

Sybase中的

timestamp列类型与时间和日期无关……(请查看此What is the mysterious 'timestamp' datatype in Sybase?)。

如果您希望能够按日期时间(组合日期和时间)过滤记录,则应查看以下内容:

  1. 表中日期时间类型的列

您还可以使用sybase的getdate()函数记录默认值,如:     datetime_field DATETIME默认为getDate()

  1. 使用2列DATE和TIME类型的列,您可以组合然后获得DATETIME类型,该类型可用于过滤记录。

例如:

# Casting into a DATETIME from DATE and TIME fields
CAST(date_field AS DATETIME) + CAST(time_field AS DATETIME)

# Filtering against DATETIME
SELECT * FROM MyTable
WHERE datetime_field < CAST(date_field AS DATETIME) + CAST(time_field AS DATETIME)

答案 1 :(得分:0)

如果要创建将某些整数转换为日期时间类型的手动转换函数,则可以自己编写UDF(用户定义函数)。

create function todatetime(@mydate int, @mytime int)
returns datetime
as
  declare @year int, @month int, @day, @hour int, @minute int, @second @int
  declare @datestring varchar(50)
  select @year = @mydate / 365 + 1970
  select @month = @mydate ...

  select @datestring = convert(varchar, @year + "-" + @month + ...
  return convert(datetime, @datestring)
go

当然,您必须添加leap年支持等,但这是可行的,应该可以完成工作。

答案 2 :(得分:0)

假设您将这两列命名为DaysSince1970HoursSinceMidnight ...

然后,您可以使用表达式构建推断的datetime(而不是timestamp

dateadd(hh,HoursSinceMidnight,dateadd(dd,DaysSince1970,'1-jan-1970'))

但是,这是一个计算所得的列,对于索引搜索来说将很糟糕,因此您将需要类似的逻辑。

DECLARE @DaysSince1970      int
,       @HoursSinceMidnight int
,       @SearchDateTime     datetime

SELECT  @DaysSince1970      = datediff(dd,'1-Jan-1970',@SearchDateTime)
,       @HoursSinceMidnight = datepart(hh,@SearchDateTime)

-- search your table
SELECT  *
FROM    tablename
WHERE   DaysSince1970       = @DaysSince1970
AND     HoursSinceMidnight  = @HoursSinceMidnight

理想情况下,您的表将需要在DaysSince1970HoursSinceMidnight上建立索引。

查找范围内的行将是对此的简单扩展,但是请记住,一旦检查了多天,就不要检查“原始”小时数范围,只需检查日期范围,然后使用第一种方法我给你检查的日期/时间范围。

答案 3 :(得分:0)

我也尝试了一些选项,这个选项似乎对我有用:

CONVERT(
   VARCHAR,
   DATEADD(
      DAY,
      time_captured.end_date,
      `DEC 31 1971`
   ),
   104
) || `` || RIGHT(
   `00` || CONVERT(
      VARCHAR,
      FLOOR(time_captured.end_time/60)
   ),
   2
) || `:` || RIGHT(
   `00` + CONVERT(
      VARCHAR,
      time_captured.end_time%60
   ),
   2
) || `:00` >= CONVERT(
   VARCHAR,
   DATEADD(
      DAY,
      sp.start_date,
      `DEC 31 1971`
   ),
   104
) || `` || RIGHT(
   `00` || CONVERT(
      VARCHAR,
      FLOOR(sp.start_time/60)
   ),
   2
) || `:` || RIGHT(
   `00` + CONVERT(
      VARCHAR,
      sp.start_time%60
   ),
   2
) || `:00`

该数据库的创建方式很奇怪。感谢您的所有回答!