从单独的日期和时间 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?)。
如果您希望能够按日期时间(结合日期和时间)过滤记录,您应该查看以下内容:
- 您的 table
中日期时间类型的列
您也可以使用 sybase 的 getdate() 函数来记录默认值,截至:
datetime_field DATETIME 默认 getDate()
- 使用 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
当然你必须添加闰年支持等,但这是可行的,它应该完成这项工作。
假设您将这两列命名为 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
理想情况下,您的 table 需要在 DaysSince1970
、HoursSinceMidnight
.
上建立索引
在一个范围内查找行将是对此的简单扩展,但请记住,一旦您检查多天,不要检查 '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`
这个数据库的制作方式很奇怪。感谢您的所有回答!
我正在尝试从数据库中的字段创建一个从 - 到日期时间的范围 table。
很遗憾,这些字段未保存为时间戳。
我有两个条目 - 从午夜开始的小时数 - 从 1970 年 1 月 1 日开始的天数
是否有命令组合这些条目以便我可以使用 select 语句并在一定时间范围内进行搜索?
我的数据库是sybase 15.7
Sybase 中的时间戳列类型不是...关于时间和日期(看这个 What is the mysterious 'timestamp' datatype in Sybase?)。
如果您希望能够按日期时间(结合日期和时间)过滤记录,您应该查看以下内容:
- 您的 table 中日期时间类型的列
您也可以使用 sybase 的 getdate() 函数来记录默认值,截至: datetime_field DATETIME 默认 getDate()
- 使用 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
当然你必须添加闰年支持等,但这是可行的,它应该完成这项工作。
假设您将这两列命名为 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
理想情况下,您的 table 需要在 DaysSince1970
、HoursSinceMidnight
.
在一个范围内查找行将是对此的简单扩展,但请记住,一旦您检查多天,不要检查 '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`
这个数据库的制作方式很奇怪。感谢您的所有回答!