【问题标题】:A way to extract from a DateTime value data without seconds一种无需秒即可从 DateTime 值数据中提取的方法
【发布时间】:2012-02-12 09:03:09
【问题描述】:

我有一个 sql DateTime (ms sql server) 并且想要提取相同的日期而不包含秒数: 例如2011-11-22 12:14:58.000 变成:2011-11-22 12:14:00.000

我该怎么做?我正在考虑将DATEADDDATEPART 结合使用,但似乎很容易出错(除了性能问题)

【问题讨论】:

  • 这似乎容易出错?
  • 很长而且很难正确书写? :-)
  • 是要隐藏秒数吗?为什么你总是将秒数设置为 000??
  • @Fahim 我想要 0 秒,因为我想对同一日期/小时/分钟的记录进行分组

标签: sql sql-server datetime


【解决方案1】:

对于使用字符串截断的解决方案,试试这个:

SELECT CAST(CONVERT(CHAR(16), GetDate(),20) AS datetime)

CHAR(16) 仅在我们的变量转换为 ODBC 规范 格式时才有效,如上所示,使用 20 作为格式说明符。

DECLARE @date DateTime = '2011 Nov 22 12:14:55';
SELECT CONVERT(Char(16), @date ,20) AS datetime

结果:

| datetime         |
|------------------|
| 2011-11-22 12:14 |

然后您只需转换回 DateTime 类型即可继续使用该值。

注意:这仅适用于不携带时区信息的数据类型。 此外,到 VarChar 和返回的类型转换通常比使用内部使用数字运算的 DateTime 函数的性能更少

如果您担心性能问题或者您必须保留时区信息,请考虑发布的其他解决方案。

【讨论】:

  • 这不是一个好的答案。首先,必须使用CHAR(17),否则分钟会出错。其次,此方法会产生类型转换警告。
  • 假设这个查询是正确的,我只是浪费了 1 个小时的工作:p 谢谢你,互联网!
  • 使用示例中显示的输入字符串时,此答案是正确的。但是,如果我们操作的字段是 DateTime 对象,则不正确。
  • 不能处理日期时间是一个相当严重的弱点。文本转换是一个起点,但我们需要一个更通用的解决方案。而且它不会让我收回我的赞成票。
  • 各位寻求者,继续滚动到下面的 t-clausen.dk 的解决方案。
【解决方案2】:
DECLARE @TheDate DATETIME
SET @TheDate = '2011-11-22 12:14:58.000'

DATEADD(mi, DATEDIFF(mi, 0, @TheDate), 0)

在查询中

/* ...all records in that minute; index-friendly expression */ 
WHERE TheDate BETWEEN DATEADD(mi, DATEDIFF(mi, 0, @TheDate), 0) 
                  AND DATEADD(mi, DATEDIFF(mi, 0, @TheDate) + 1, 0)

【讨论】:

    【解决方案3】:
    SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, yourcolumn), 0) FROM yourtable
    

    如果您不想在数据类型之间进行缓慢的转换,这将是有效的。

    【讨论】:

    • 关于“编辑,最佳解决方案”,这样的投射将四舍五入到最接近的分钟。 OP希望秒数被截断,而不是四舍五入。显示舍入结果的示例:DECLARE @myDate DATETIME = '2007-05-08 12:35:32' SELECT CAST(@myDate AS smalldatetime)
    • @Ojen 你是绝对正确的,很好。我删除了我的答案的那部分
    【解决方案4】:

    如果没有毫秒,那么

    DECLARE @dt datetime2 = '2011-11-22 12:14:58.000';
    DECLARE @goalDt datetime2 = DATEADD(second,-DATEPART(second,@dt), @dt);
    

    要删除毫秒部分,请添加

    SET @goalDt = DATEADD(millisecond,-DATEPART(millisecond,@goalDt ), goalDt dt);
    

    【讨论】:

      【解决方案5】:

      日期和时间需要谨慎,不要被转换成TEXT。

      我的个人解决方案:

          CREATE FUNCTION [dbo].[fnDateTimeTruncated]
      (
          @datetime DATETIME
      )
      RETURNS DATETIME
      AS
      BEGIN
          RETURN DATETIMEFROMPARTS ( year(@datetime), month(@datetime), day(@datetime), DATEPART(hh,@datetime), DATEPART(mi,@datetime), 0, 0)
      END
      

      已编辑:

      对于http://blog.waynesheffield.com/wayne/archive/2012/03/truncate-a-date-time-to-different-part/,DateAdd 有更好的性能。 感谢 t-clausen.dk

      【讨论】:

      • DateTimeFromParts 不是一个有效的解决方案。找到这个Link
      • 感谢克劳森提供的信息。
      【解决方案6】:

      稍微摆弄一下,这似乎效果很好:

      SELECT CAST(CONVERT(CHAR(17), bl.[time],113) AS varchar(17))
      

      给出的结果:2011-11-22 12:14

      我在查询中使用它作为选择列表的一部分的确切方式:

      ,CAST(CONVERT(CHAR(17), bl.[time],113) AS varchar(17))
      + '    (UTC +0)' AS [TIME]
      

      给我结果:2017 年 12 月 15 日 06:43 (UTC +0)

      【讨论】:

      • ,CAST(CONVERT(CHAR(17), bl.[time],113) AS varchar(17)) 是我正在寻找的结果 (15 Dec 2017 06:43) 的解决方案。
      【解决方案7】:

      四舍五入:

      DECLARE @TheDate DATETIME;
      SET @TheDate = '2019-1-2 12:14:58.400';
      
      SELECT CAST(@TheDate AS SMALLDATETIME);
      

      只是截断:

      DECLARE @TruncTheDate DATETIME;
      SET @TruncTheDate = '2019-1-2 12:14:58.400';
      
      SELECT DATEADD(mi, DATEDIFF(mi, 0, @TruncTheDate), 0);
      

      【讨论】:

        【解决方案8】:

        从 SQL Server 2014 开始,您可以为此使用 Format 函数。

        例如

         declare @Startdate datetime = '2020-11-07 15:27:50.713'
        
         set  @Startdate = Convert(datetime,FORMAT(@Startdate, 'yyyy-MM-dd HH:mm'))
        
        
        > Result is 
        2020-11-07 15:27:00.000
        

        【讨论】:

        • 不错的选择。但这应该只用于小桌子。在较大的表中,例如在我的情况下,在 datetime 变量上有 1000 万行索引,这将查询时间从 2 秒增加到 23 秒。更多信息:sqlperformance.com/2015/06/t-sql-queries/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-23
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多