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

Create a timestamp from seperate date and time int

我正在尝试从数据库中的字段创建一个从 - 到日期时间的范围 table。

很遗憾,这些字段未保存为时间戳。

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

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

我的数据库是sybase 15.7

Sybase 中的时间戳列类型不是...关于时间和日期(看这个 What is the mysterious 'timestamp' datatype in Sybase?)。

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

  1. 您的 table
  2. 中日期时间类型的列

您也可以使用 sybase 的 getdate() 函数来记录默认值,截至: datetime_field DATETIME 默认 getDate()

  1. 使用 DATE 和 TIME 类型的 2 列,然后您可以组合以获得可用于过滤记录的 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)

如果你想制作一个将一些整数转换为日期时间类型的手动转换函数,你可以自己编写一个 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

当然你必须添加闰年支持等,但这是可行的,它应该完成这项工作。

假设您将这两列命名为 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

理想情况下,您的 table 需要在 DaysSince1970HoursSinceMidnight.

上建立索引

在一个范围内查找行将是对此的简单扩展,但请记住,一旦您检查多天,不要检查 'raw' 小时的范围,只需检查日期范围,然后使用我给你的第一种方法来检查 date/time 范围。

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

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`

这个数据库的制作方式很奇怪。感谢您的所有回答!