2010-02-13 123 views
2

問題是日期作爲nvarchar()存儲在SQL數據庫中,並且時間存儲在單獨的列中。我只能讀取這個數據庫,所以我不能改變格式。此外,如果製造商發現這可能會使我們的支持失效。在SQL中,我想從上一行日期中減去日期

正如我所看到的,我需要首先將日期和時間組合成一個單元格作爲日期時間,然後從當前減去前一行。

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服務器端解決方案。

+1

你想找到兩行之間的時間差? – 2010-02-13 17:39:37

+0

是的,但請記住,數據類型是varchar – fishhead 2010-02-13 18:40:26

+0

我想我已經涵蓋了幾乎所有情況下:) – 2010-02-13 19:27:15

回答

3

在Microsoft SQL Server,你列轉換的日期,你可以

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

DATEDIFF (Transact-SQL)參數兩個日期

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

更多之間進行比較。

而且擺脫當前的日期/時間使用的差異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

你使用什麼語言,它是什麼類型的數據庫?我不確定數據庫是否有能力在查詢中執行行操作(從另一行中減去一行),因此您必須以編程方式執行此操作。我不確定您使用的語言,但是如果它有DateTime API,則可以使用它創建Date對象。應該有一個函數返回自開始日期(1970年1月1日之後)以來的總秒數。您創建兩個對象,將其轉換爲秒數,然後減去它們。然後你可以計算它們之間的天數。

-1

如果您使用PHP,我建議您使用strtotime()函數將其轉換爲時間對象。在兩個日期都這樣做。差異會給你他們之間的秒數。

+0

OP要求一個'SQL'解決方案。 – mikerobi 2011-05-21 16:44:01