Создать метку времени из отдельной даты и времени

Я пытаюсь создать диапазон от - до даты и времени из полей в таблице базы данных.

К сожалению, поля не сохраняются как отметка времени.

У меня есть две записи - время в часах с полуночи - дата в днях с 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?).

Если вы хотите иметь возможность фильтровать записи по дате и времени (объединяя дату и время), вот что вы должны посмотреть:

  1. столбец типа datetime в вашей таблице

Вы также можете использовать функцию getdate() sybase, чтобы записать значение по умолчанию, как: datetime_field DATETIME default getDate()

  1. используя 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

Конечно, вы должны добавить поддержку високосного года и т. Д., Но это выполнимо, и это должно сделать работу.

Другие вопросы по тегам