Создать метку времени из отдельной даты и времени
Я пытаюсь создать диапазон от - до даты и времени из полей в таблице базы данных.
К сожалению, поля не сохраняются как отметка времени.
У меня есть две записи - время в часах с полуночи - дата в днях с 1 января 1970 года
Существует ли команда для объединения этих записей, чтобы я мог использовать оператор выбора и выполнять поиск в течение определенного периода времени?
Моя база данных sybase 15.7
4 ответа
Я попробовал несколько вариантов, и этот, кажется, работает для меня:
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`
Способ создания этой базы данных довольно странный. Спасибо за все ваши ответы!
Тип столбца timestamp в Sybase не... о времени и дате (посмотрите на это Что за таинственный тип данных timestamp в Sybase?).
Если вы хотите иметь возможность фильтровать записи по дате и времени (объединяя дату и время), вот что вы должны посмотреть:
- столбец типа datetime в вашей таблице
Вы также можете использовать функцию getdate() sybase, чтобы записать значение по умолчанию, как: datetime_field DATETIME default getDate()
- используя 2 столбца типа DATE и TIME, вы можете комбинировать их, чтобы получить тип 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)
Предполагая, что вы назвали эти две колонки 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
,
Поиск строк в диапазоне будет простым расширением этого, но помните, что после проверки за несколько дней не проверяйте диапазон "сырых" часов, просто проверьте диапазон дня, а затем используйте первый метод, который я дал вам проверить диапазон даты / времени.
Если вы хотите создать функцию ручного преобразования, которая переводит некоторое целое число в тип 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
Конечно, вы должны добавить поддержку високосного года и т. Д., Но это выполнимо, и это должно сделать работу.