我正在尝试从数据库表中的字段创建从-到datetime的范围。
不幸的是,没有将字段保存为时间戳。
我有两个条目 -从午夜开始的小时数 -1970年1月1日起的日期
是否有命令组合这些条目,以便我可以使用select语句并在一定时间范围内进行搜索?
我的数据库是sybase 15.7
答案 0 :(得分:0)
timestamp列类型与时间和日期无关……(请查看此What is the mysterious 'timestamp' datatype in Sybase?)。
如果您希望能够按日期时间(组合日期和时间)过滤记录,则应查看以下内容:
您还可以使用sybase的getdate()函数记录默认值,如: datetime_field DATETIME默认为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)
答案 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)
假设您将这两列命名为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
上建立索引。
查找范围内的行将是对此的简单扩展,但是请记住,一旦检查了多天,就不要检查“原始”小时数范围,只需检查日期范围,然后使用第一种方法我给你检查的日期/时间范围。
答案 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`
该数据库的创建方式很奇怪。感谢您的所有回答!