在SQL中截断秒和毫秒

14

我在截断数据方面遇到了一些麻烦。我正在使用 SQL 的 GETDATE() 函数获取当前日期和时间,并将它们输入到数据库中。然而,我只想保存日期和时间到分钟为止。换句话说,当我输入新数据时,我希望保存为 dd/mm/yyyy hh:mm:00.000 或 dd/mm/yyyy hh:mm。我该如何做?

我应该注意到我正在使用 MS-SQL。

5个回答

24

有许多方法可以处理这个问题。

例如,您可以首先将从 GetDate() 生成的 datetime 转换为 smalldatetime,如下所示:

CAST(GetDate() AS smalldatetime)

需要明确的是,这将根据当前秒的值将生成的秒数四舍五入到最近的一分钟(向上或向下)。

编辑:

或者,您可以让SQL Server为您截断datetime,以便更“清洁”地(即无需四舍五入,因为该值已被预先截断)转换为smalldatetime

CAST(DateAdd(minute, DateDiff(minute, 0, GetDate()), 0) AS smalldatetime)

5

关于截断:

SELECT SMALLDATETIMEFROMPARTS(
         datepart(year  ,dt)
        ,datepart(month ,dt)
        ,datepart(day   ,dt)
        ,datepart(hour  ,dt)
        ,datepart(minute,dt)
      ) 
FROM (SELECT GETDATE()) t(dt)

请注意:此功能仅适用于SQL Server 2012及以上版本。 - KekuSemau

3
一种方法是将其转换为smalldatetime进行分配(并根据需要再转换回来)。smalldatetime始终将秒及以后的部分设置为00。
SELECT CONVERT(smalldatetime, GETDATE())

由于这可能会四舍五入,另一种安全地 截取 秒数的方法是这样的:

SELECT CONVERT(datetime, CONVERT(nchar(16), GETDATE(), 120), 120)

转换代码120 返回格式 yyyy-mm-dd hh:mi:ss


-1 SELECT CAST('1999-12-31 23:59:30' AS smalldatetime)-1 选择CAST('1999-12-31 23:59:30' AS smalldatetime) - Anon
您选择的中间转换格式“nchar(16)”太小了,您至少需要“nchar(19)”才能避免秒数被截断。 - Alexander Powolozki
@AlexanderPowolozki 在评论之前,您可能需要先阅读一篇帖子。它确实说“另一种安全截断秒的方法”。这就是目的。 - KekuSemau
1
@KekuSemau,你说得对,我在脑海中只考虑了截断毫秒但保留秒的任务,没有仔细阅读帖子,非常感谢你的评论。 - Alexander Powolozki

1

结合DATEADDSMALLDATETIME进行截断。

CAST(DATEADD(S, -30, dt) AS SMALLDATETIME)

0
另一个选择是不确定为什么你不能考虑前端而不是后端,因此如果在你尝试实现的上下文中可行或合适的话,请不要更改SQL和格式,在前端中按照dd/MM/yyyy HH:mm或所需任何格式进行格式化。例如,在SSRS报告中,您可以在报告设计器中格式化相关字段或使用Format函数。如果它是一个网页或Excel,我相信你也可以做类似的事情。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接