不同行中两个日期之间的SQL持续时间
如果有人能帮我构造一个MSSQL Server 2000查询,返回客户的a条目和B条目之间的持续时间,我将非常感谢您的帮助 并非所有客户都希望有B记录,因此不会返回结果 客户审计 +---+---------------+---+----------------------+ |彼得·格里芬2013-01-01 15:00:00| |马丁·比格斯2013-01-02 15:00:00| |彼得·格里芬2013-01-05 09:00:00| |超级马里奥2013-01-01 15:00:00| |马丁·比格斯2013-01-03 18:00:00| +---+---------------+---+----------------------+ 我希望得到类似的结果: +--------------+----------------+ | Martin Biggs | 1 day, 3 hours | +--------------+----------------+ +--------------+----------------+ |Martin Biggs | 1天3小时| +--------------+----------------+ 类似下面的内容(不知道您的模式,因此需要更改对象的名称)就足够了不同行中两个日期之间的SQL持续时间,sql,tsql,sql-server-2000,Sql,Tsql,Sql Server 2000,如果有人能帮我构造一个MSSQL Server 2000查询,返回客户的a条目和B条目之间的持续时间,我将非常感谢您的帮助 并非所有客户都希望有B记录,因此不会返回结果 客户审计 +---+---------------+---+----------------------+ |彼得·格里芬2013-01-01 15:00:00| |马丁·比格斯2013-01-02 15:00:00| |彼得·格里芬2013-01-05 09:00:00| |超级马里奥2013-01-01 15:00:00|
SELECT ABS(DATEDIFF(HOUR, CA.TheDate, CB.TheDate)) AS HoursBetween
FROM dbo.Customers CA
INNER JOIN dbo.Customers CB
ON CB.Name = CA.Name
AND CB.Code = 'B'
WHERE CA.Code = 'A'
这是Oracle查询,但据我所知,MS Server中的所有功能都可用。我确信我不必告诉您如何连接输出以获得所需的结果。输出中的所有值将在单独的列中-天、小时等。。。在这里格式化输出并不总是那么容易:
SELECT id, name, grade
, NVL(EXTRACT(DAY FROM day_time_diff), 0) days
, NVL(EXTRACT(HOUR FROM day_time_diff), 0) hours
, NVL(EXTRACT(MINUTE FROM day_time_diff), 0) minutes
, NVL(EXTRACT(SECOND FROM day_time_diff), 0) seconds
FROM
(
SELECT id, name, grade
, (begin_date-end_date) day_time_diff
FROM
(
SELECT id, name, grade
, CAST(start_date AS TIMESTAMP) begin_date
, CAST(end_date AS TIMESTAMP) end_date
FROM
(
SELECT id, name, grade, start_date
, LAG(start_date, 1, to_date(null)) OVER (ORDER BY id) end_date
FROM stack_test
)
)
)
/
Output:
ID NAME GRADE DAYS HOURS MINUTES SECONDS
------------------------------------------------------------
1 Peter Griffin A 0 0 0 0
2 Martin Biggs A 1 1 0 0
3 Peter Griffin C 2 17 0 0
4 Super Mario A -3 -18 0 0
5 Martin Biggs A 2 3 0 0
我使用的表结构/列-如果您提前处理好这些和数据,那就太好了:
CREATE TABLE stack_test
(
id NUMBER
,name VARCHAR2(50)
,grade VARCHAR2(3)
,start_date DATE
)
/
我们如何确定日期将大于另一个日期?否则,
DATEDIFF
可能会导致小时数为负:)@bonCodigo-是的,我们无法从规范和单个示例中推断出这一点,如果日期可能是“另一种方式”,则可以通过ABS(…)
(现在添加到答案中)。这对我来说是足够的信息,可以使用-而且我已经学会了ABS函数:):)我指的是ABS()
,也许这会让
SELECT id, name, grade
, NVL(EXTRACT(DAY FROM day_time_diff), 0) days
, NVL(EXTRACT(HOUR FROM day_time_diff), 0) hours
, NVL(EXTRACT(MINUTE FROM day_time_diff), 0) minutes
, NVL(EXTRACT(SECOND FROM day_time_diff), 0) seconds
FROM
(
SELECT id, name, grade
, (begin_date-end_date) day_time_diff
FROM
(
SELECT id, name, grade
, CAST(start_date AS TIMESTAMP) begin_date
, CAST(end_date AS TIMESTAMP) end_date
FROM
(
SELECT id, name, grade, start_date
, LAG(start_date, 1, to_date(null)) OVER (ORDER BY id) end_date
FROM stack_test
)
)
)
/
Output:
ID NAME GRADE DAYS HOURS MINUTES SECONDS
------------------------------------------------------------
1 Peter Griffin A 0 0 0 0
2 Martin Biggs A 1 1 0 0
3 Peter Griffin C 2 17 0 0
4 Super Mario A -3 -18 0 0
5 Martin Biggs A 2 3 0 0
CREATE TABLE stack_test
(
id NUMBER
,name VARCHAR2(50)
,grade VARCHAR2(3)
,start_date DATE
)
/