1

我试图从数据库表中的字段创建从 - 到日期时间范围。

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

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

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

我的数据库是 sybase 15.7

4

4 回答 4

0

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

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

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

您还可以使用 sybase 的 getdate() 函数记录默认值,如下所示: datetime_field DATETIME default 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)
于 2018-07-07T08:00:51.017 回答
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

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

于 2018-07-08T21:47:22.467 回答
0

假设您命名了这两列DaysSince1970并且HoursSinceMidnight...

然后您可以使用表达式构建推断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

理想情况下,您的表将需要并在DaysSince1970,上建立索引HoursSinceMidnight

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

于 2018-07-09T06:44:14.667 回答
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`

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

于 2018-07-09T20:14:36.277 回答