В SQL я хотел бы вычесть дату из даты предыдущей строки - PullRequest
2 голосов
/ 13 февраля 2010

Проблема в том, что даты хранятся в базе данных SQL как nvarchar(), а время хранится в отдельном столбце. У меня есть доступ только для чтения к этой базе данных, поэтому я не могу изменить формат. Кроме того, это, вероятно, лишит нас поддержки, если производитель узнает.

Как я вижу, мне нужно сначала объединить даты и время в одну ячейку как дату и затем вычесть предыдущую строку из текущей.

ActualTime, ActualDate
5:30:26,    31-Dec-09
16:01:47,   31-Dec-09
17:35:50,   31-Dec-09
18:31:31,   31-Dec-09
18:51:03,   31-Dec-09
18:55:35,   31-Dec-09
19:26:53,   31-Dec-09
 5:25:37,   1-Jan-10
5:38:36,    1-Jan-10
5:46:58,    1-Jan-10
6:27:00,    1-Jan-10

Несколько человек спросили, какой язык я использовал. Я надеялся сделать все это на сервере. На стороне кода (C #) это тривиальная проблема. Как я уже сказал, я ищу решение на стороне сервера SQL Server.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2010

В Microsoft SQL Server, чтобы конвертировать ваши столбцы в дату, вы можете

Select Cast( ActualDate + ' ' + ActualTime AS DateTime)

для сравнения двух дат

Select
    Datediff(
             second,
             Cast('13-dec-2009 ' + '19:39:33' As DateTime),
             Cast('13-dec-2009 ' + '19:26:33' As DateTime)
            )

Подробнее о DATEDIFF (Transact-SQL) параметры.

А чтобы получить разницу от текущей даты / времени, используйте GETDATE(),

    Select
       *,
       oldness = DateDiff(
                   second,
                   GETDATE(),
                   Cast(ActualDate + ' ' + ActualTime AS DateTime)
                  )
    From
       your_table

Наконец, чтобы сделать это между строками (для всей таблицы ..),

Select  *,
        Cast(ActualDate + ' ' + ActualTime AS DateTime) as [fulldate],
        DiffFromPrevious = Coalesce(
            DateDiff(
                second,
                (
                  Select Top 1 Cast(ActualDate + ' ' + ActualTime AS DateTime) AS [fulldate]
                  From yourtable
                  Where Cast(ActualDate + ' ' + ActualTime AS DateTime) < Cast(t1.ActualDate + ' ' + t1.ActualTime AS DateTime)
                  Order By [fulldate] Desc
                ),
                Cast(ActualDate + ' ' + ActualTime AS DateTime)
            ),
        0)
From
    yourtable t1
Order By
    [fulldate] Asc
0 голосов
/ 13 февраля 2010

Если вы используете PHP, я предлагаю вам использовать функцию strtotime (), чтобы преобразовать его в объект времени.Сделайте это для обеих дат.Разница даст вам количество секунд между ними.

0 голосов
/ 13 февраля 2010

Какой язык вы используете, и что это за база данных? Я не уверен, есть ли у базы данных возможность манипулировать строками в запросе (вычитая одну строку из другой), поэтому вам придется делать это программно. Я не уверен, какой язык вы используете, но если у него есть API Date или Time, то вы можете использовать его для создания Date объекта. Должна быть функция, которая возвращает общее количество секунд с даты начала (1 января 1970 года или что-то в этом роде). Вы создаете два Date объекта, конвертируете их в количество секунд и затем вычитаете их. Затем вы можете рассчитать количество дней между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...