我试图从数据库表中的字段创建从 - 到日期时间范围。
不幸的是,这些字段没有保存为时间戳。
我有两个条目 - 从午夜开始的小时数 - 从 1970 年 1 月 1 日开始的日期
是否有组合这些条目的命令,以便我可以使用 select 语句并在一段时间内搜索?
我的数据库是 sybase 15.7
Sybase 中的时间戳列类型不是......关于时间和日期(看看这个What is the wonderful 'timestamp' datatype in Sybase?)。
如果您希望能够按日期时间(结合日期和时间)过滤记录,您应该查看以下内容:
您还可以使用 sybase 的 getdate() 函数记录默认值,如下所示: datetime_field DATETIME default getDate()
例如:
# 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
当然,您必须添加闰年支持等,但这是可行的,它应该可以完成这项工作。
假设您命名了这两列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
。
在一个范围内查找行将是一个简单的扩展,但请记住,一旦您检查多天,不要检查“原始”小时的范围,只需检查日期范围,然后使用我给出的第一种方法您检查日期/时间范围。
我也尝试了一些选项,这个选项似乎对我有用:
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`
这个数据库的制作方式很奇怪。感谢您的所有回答!