在SQL中,我想从上一行日期中减去一个日期

时间:2010-02-13 17:33:37

标签: c# sql

问题是日期作为nvarchar()存储在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服务器端解决方案。

3 个答案:

答案 0 :(得分:3)

在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

答案 1 :(得分:0)

您使用的是哪种语言,它是什么类型的数据库?我不确定数据库是否具有在查询中进行行操作的功能(从另一行中减去一行),因此您必须以编程方式执行此操作。我不确定您使用的语言是什么,但如果它有DateTime API,那么您可以使用它来创建Date对象。应该有一个函数返回自开始日期(1970年1月1日或其他东西)以来的总秒数。您创建两个Date对象,转换为秒数然后减去它们。然后,您可以计算它们之间的天数。

答案 2 :(得分:-1)

如果您使用的是PHP,我建议您使用strtotime()函数将其转换为时间对象。这两个日期都这样做。差异将为您提供它们之间的秒数。