【问题标题】:Omitting the Milliseconds in a Date省略日期中的毫秒
【发布时间】:2010-02-11 18:24:56
【问题描述】:

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

SQL Server 中是否有执行此操作的函数?还是我必须编写自己的函数?同样,我不希望它是 varchar 类型,而是 datetime 类型。

【问题讨论】:

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


    【解决方案1】:

    使用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 及更早版本上:

    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())
    

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

    【讨论】:

    • 哇,太好了,但不幸的是,SQL Server 2005 :-(
    • Brian,我删除了 SQL Server 2008 标签。如果您需要一个仅适用于 2005 的解决方案,则不应使用不正确的版本进行标记。
    • @PeterRadocchia 我没有检查 SQL 2005 语句,但使用 DATETIME2 的语句将毫秒四舍五入到最接近的秒数。
    • @PeterRadocchia 你应该提到它。人们可能会根据需要舍入还是截断来使用您的解决方案
    • @PeterRadocchia 太好了,谢谢!这应该对那些寻求答案的人有所帮助:)
    【解决方案2】:

    用途:

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

    这个:

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

    ...省略毫秒,返回一个 VARCHAR。因此,您将其转换/转换为 DATETIME 以便使用所需的数据类型。

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

    【讨论】:

    • 将数字转换为字符串,然后再返回非常低效。使用 SQL 中提供的日期时间函数
    【解决方案3】:

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

    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)
    

    【讨论】:

    • 这可以完美运行,无需四舍五入。帮助过我。谢谢:)
    • 对于那些正在寻找没有毫秒部分的答案的人,那么这不适合您,这会在毫秒内给出“000”,您可以尝试@Peter Radocchia 的方法。如果你对“000”没问题,这对你来说是完美的。但越干净越好
    【解决方案4】:

    试试这个

     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)
    

    【讨论】:

    • 将数字转换为字符串,然后再返回非常低效。使用 SQL 中提供的日期时间函数
    • 你会得到毫秒的溢出
    • 您所要做的就是用 DATEADD() 减去毫秒数。无需从 0 开始添加。
    【解决方案5】:
    SELECT  GETDATE(),
            CONVERT(DATETIME, CONVERT(VARCHAR(MAX), GETDATE(), 120), 120)
    

    【讨论】:

    • 最外面的CONVERT上的, 120不是多余的吗?
    • 从字符串转换为日期时间时会忽略 CONVERT 格式样式 (120)。 BOL 表示: 用于将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)的日期格式样式;或用于将 float、real、money 或 smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)的字符串格式。当 style 为 NULL 时,返回的结果也为 NULL。
    • @KM:在这种情况下,参数确实是多余的,因为这种格式没有任何歧义。但是,情况并非总是如此。运行这个:SELECT CONVERT(DATETIME, '01/02/2010', 101), CONVERT(DATETIME, '01/02/2010', 103).
    • @KM:我认为您的在线图书版本非常过时(可能是 2000 或 2005 RTM)?从那时起已经有几次更新,您应该确保您的本地副本是最新的。观察 CAST 和 CONVERT 主题中更改的措辞:msdn.microsoft.com/en-us/library/ms187928%28SQL.90%29.aspx - @Quassnoi 是绝对正确的,实际上我将发布与他完全相同的示例。
    • @Quassnoi:VARCHAR(MAX) 可能有点多,不是吗? :-)
    【解决方案6】:

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

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

    来自SQL Server remove milliseconds from datetime

    【讨论】:

      【解决方案7】:
      DATEADD(SECOND, DATEDIFF(SECOND, 0, < your datetime column >), 0)
      

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

      虽然这种方法乍一看并不直观,但请看这里以了解其背后的原理:http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes

      【讨论】:

      • 大声笑。好球,亚伦。改了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多