Создайте временную метку из отдельной даты и времени - PullRequest
0 голосов
/ 06 июля 2018

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

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

У меня есть две записи - время в часах с полуночи - дата в днях с 1 января 1970 года

Существует ли команда для объединения этих записей, чтобы я мог использовать оператор выбора и выполнять поиск за определенный промежуток времени?

Моя база данных - sybase 15.7

Ответы [ 4 ]

0 голосов
/ 09 июля 2018

Я тоже попробовал несколько вариантов, и мне кажется, что этот работает:

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`

Способ создания этой базы данных довольно странный. Спасибо за все ваши ответы!

0 голосов
/ 09 июля 2018

Если вы хотите сделать функцию ручного преобразования, которая переводит некоторое целое число в тип 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

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

0 голосов
/ 09 июля 2018

При условии, что вы назвали эти два столбца 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.

Нахождение строк в диапазоне будет простым расширением этого, но помните, что если вы проверяете в течение нескольких дней, не проверяйте диапазон «сырых» часов, просто проверьте диапазон дня, а затем используйте первый метод что я дал вам, чтобы проверить диапазон даты / времени.

0 голосов
/ 07 июля 2018

тип столбца 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)
...