省略日期中的毫秒数

时间:2010-02-11 18:24:57

标签: sql sql-server database sql-server-2005 tsql

当我从SQL Server中选择时,我希望得到一个日期,但省略毫秒值,我希望它是一个日期类型。所以如果我有一个值1/1/2009 1:23:11.923,我想省略毫秒但保留日期类型,这样它就是值1/1/2009 1:23:11.000(我知道你真的不能省略毫秒值日期,只是想让它为零)。

SQL Server中是否有一个函数可以执行此操作?或者我必须编写自己的功能?同样,我不希望它作为varchar类型,而是datetime类型。

7 个答案:

答案 0 :(得分:51)

使用DATETIME2,SQL Server 2008中支持小数精度的新数据类型:

SELECT
  CONVERT(DATETIME2(0),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss]
, CONVERT(DATETIME2(1),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.f]
, CONVERT(DATETIME2(2),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ff]
, CONVERT(DATETIME2(3),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fff]
, CONVERT(DATETIME2(4),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffff]
, CONVERT(DATETIME2(5),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffff]
, CONVERT(DATETIME2(6),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.ffffff]
, CONVERT(DATETIME2(7),SYSDATETIME()) [yyyy-mm-dd hh:mm:ss.fffffff]

转换将舍入到最近的单位,例如:

2014-09-04 09:35:47.0162993 as DATETIME2(4) -> 
2014-09-04 09:35:47.0163

或者,在SQL 2005和eariler上:

SELECT
  original  = GETDATE()
, [floor]   = DATEADD(ms,-DATEPART(ms,GETDATE()),GETDATE())
, [ceiling] = DATEADD(ms,1000-DATEPART(ms,GETDATE()),GETDATE())
, [rounded] = DATEADD(ms,CASE WHEN DATEPART(ms,GETDATE()) < 500 THEN 0 ELSE 1000 END-DATEPART(ms,GETDATE()),GETDATE())

这比转换为字符串表示形式要快一些。

答案 1 :(得分:11)

使用:

SELECT CONVERT(DATETIME, CONVERT(VARCHAR(19), GETDATE(), 120))

此:

CONVERT(VARCHAR(19), GETDATE(), 120)

...省略毫秒,返回VARCHAR。因此,您可以将其CAST / CONVERT到DATETIME中,以便使用所需的数据类型。

请参阅this link for a list of various date/time formats you can work with

答案 2 :(得分:9)

如果您不想使用字符串转换,这是一个解决方案:

DECLARE @TheDate datetime, @Today datetime
SET @TheDate = GetDate()

SET @Today = DateAdd(dd, DateDiff(dd, 0, @TheDate), 0)
SELECT DateAdd(s, DateDiff(s, @Today, @TheDate), @Today)

答案 3 :(得分:6)

试试这个

 declare @DATE datetime
 select @DATE = '1/1/2009 1:23:11.923'



 SELECT convert(datetime,CONVERT(char(35),@DATE,120))

或仅限日期功能

DECLARE @DATE DATETIME
SELECT @DATE = '1/1/2009 1:23:11.923'

SELECT DATEADD(SECOND, DATEDIFF(SECOND, 39000, @DATE), 39000)

答案 4 :(得分:4)

SELECT  GETDATE(),
        CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)

答案 5 :(得分:3)

从日期减去毫秒。 (或者加上毫秒的负值)

SELECT DATEADD(ms, -DATEPART(ms, GETDATE()), GETDATE()) 

来自SQL Server remove milliseconds from datetime

答案 6 :(得分:2)

DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)

可能需要将0更改为其他内容以防止出现溢出错误。现在没有SQL Server可以验证。

虽然这种方法乍一看似乎并不直观,但请看一下其背后的基本原理:http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes