SQL Server 无法减去日期
Posted
技术标签:
【中文标题】SQL Server 无法减去日期【英文标题】:Unable to Subtract Dates SQL Server 【发布时间】:2013-07-29 07:20:06 【问题描述】:我正在尝试使用此查询获取日期时差:
SELECT BASESCORE,
Max(CONVERT(DATETIME, '')) - Min(CONVERT(DATETIME, '')) AS datediff
FROM log
GROUP BY BASESCORE
ORDER BY BASESCORE
它工作正常,但它给我的输出是错误的:
1900-01-01 00:00:00.000
1900-01-01 00:00:00.000
1900-01-01 00:00:00.000
1900-01-01 00:00:00.000
1900-01-01 00:00:00.000
......
我怎样才能从上面的查询中得到正确的输出!
【问题讨论】:
那个查询没有意义。 你能解释一下你为什么要标记java吗? 您正在将空字符串转换为datetime
?你想达到什么目的?您的日期列名称是什么?
我对 SQL 完全陌生,需要一些帮助
如果您添加一些示例数据(可能在 SQL Fiddle 中),我们可以给您更好的答案。
【参考方案1】:
使用您发布的示例数据(并稍作调整),这是我解决问题的尝试:
SELECT BASESCORE,
Datediff(dd, MINDATE, MAXDATE)
FROM (SELECT BASESCORE,
Cast(Max(DATETIME) AS DATETIME) MaxDate,
Cast(Min(DATETIME) AS DATETIME) MinDate
FROM table1
GROUP BY BASESCORE)T
您可以在SQL Fiddle 上查看完整的工作版本。
如果有什么我误解了,请告诉我;-)
【讨论】:
它对 SQLFiddle 工作正常,但现在我接受了你的回答,因为它工作正常!但稍后我会给你反馈【参考方案2】:正如@Nithesh 所说,尝试使用DATEDIFF
-
DECLARE @temp TABLE(
[datetime] DATETIME
, basescore INT
)
INSERT INTO @temp
VALUES
('20130320 03:17:43', 1),
('20130320 03:17:43', 2),
('20130320 04:17:43', 1),
('20130320 03:20:43', 2)
SELECT
basescore
, [datediff] = CONVERT(
VARCHAR(10),
DATEADD(ms,
DATEDIFF([second], MIN([datetime]), MAX([datetime])) * 1000,
0), 114)
FROM @temp
GROUP BY basescore
ORDER BY basescore
输出 -
basescore datediff
----------- ----------
1 01:00:00:0
2 00:03:00:0
【讨论】:
这是一个更好的答案,因为它是完整的! 投反对票的人请告诉我和@Nithesh 的答案有什么问题? @Devart 他认为所有人都在那里提供确切的查询,我们为此获得报酬..:D 疯了... @Nithesh 我们只是在帮助人们。你不应该关注那些想法不同的人。祝你有美好的一天:)【参考方案3】:之前您向您展示了 dateformat,您再次删除了该格式,但我有时间复制它。 在我看来,这是您想要的查询和结果:
declare @t table(datetime char(20), basescore int)
insert @t values('20/Mar/2013:03:17:43', 1),('20/Mar/2013:03:17:43', 2)
('20/Mar/2013:04:17:43', 1),('20/Mar/2013:03:20:43', 2)
SELECT basescore, MAX(convertdate) - MIN(convertdate) AS datediff
-- when selecting from your own table remove '@t' from next line
FROM @t log
cross apply(select cast(stuff([datetime], 12, 1, ' ') as datetime) convertdate) a
group by basescore order by basescore
结果:
basescore datediff
1 1900-01-01 01:00:00.000
2 1900-01-01 00:03:00.000
【讨论】:
【参考方案4】:我从您上次编辑的帖子中看到,字段日期时间的值,例如“20/Mar/2013:03:17:44”。 datetime 值的格式无法通过简单的方式进行转换。
试试这个查询:
SELECT BASESCORE,
[DATEDIFF]= Datediff(second, Min(CONVERT(DATETIME,
LEFT(Rtrim(Ltrim(DATETIME)),
11) + ' '
+ RIGHT(Rtrim(Ltrim(DATETIME)
), 8))), Max
(
CONVERT(DATETIME, LEFT(Rtrim(Ltrim(DATETIME)), 11
) + ' '
+ RIGHT(Rtrim(Ltrim(DATETIME)),
8))))
FROM temptabel
GROUP BY BASESCORE
ORDER BY BASESCORE
输出:
Basescore datediff
1 1
2 0
3 0
您可以在SQLFiddle查看
【讨论】:
哇你真的帮了我亲爱的+1 @Gidil,如果有一个包含空格的值,我只使用修剪来预测 @user2496503:谢谢,但是如果您显示您的架构表,也许您可以获得更好的答案。【参考方案5】:使用DATEDIFF()
。
语法:DATEDIFF(datepart,startdate,enddate)
msdn
【讨论】:
Msg 241, Level 16, State 1, Line 1 从字符串转换日期和/或时间时转换失败。 -1?为什么是负号..请解释一下。 datediff 不是日期减法的选项?疯狂以上是关于SQL Server 无法减去日期的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 无法使用有效字符串将字符串转换为日期时间