【问题标题】:How to convert datetime to date only (with time set to 00:00:00.000)如何仅将日期时间转换为日期(时间设置为 00:00:00.000)
【发布时间】:2009-06-24 20:04:33
【问题描述】:

我有一个字符串“2009-06-24 09:52:43.000”,我需要将其插入到表的 DateTime 列中。

但我不在乎时间,只想将其插入为 2009-06-24 00:00:00.000

如何在 T-SQL 中做到这一点?

【问题讨论】:

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


    【解决方案1】:

    对于 SQL Server 2005 及以下版本:

    CONVERT(varchar(8), @ParamDate, 112)    -- Supported way
    
    CAST(FLOOR(CAST(@ParamDate AS float)) AS DATETIME)   -- Unsupported way
    

    对于 SQL Server 2008 及更高版本:

    CAST(@ParamDate AS DATE)
    

    【讨论】:

    • 我在这里一直使用“不支持的方式”。第一行的 112 幻数是什么意思?
    • 它是日期的格式说明符。见msdn.microsoft.com/en-us/library/ms187928.aspx
    • 正确。请注意只有 112 是正确的,因为它是一种 ISO 格式(而不是依赖于语言环境的格式)。
    • 为什么 varchar(8) 作为输入来转换?
    • DBAndrew:支持的方式不是我的,是微软的。我没有在这里进行显式转换,因为 Saobi 想将结果插入到 datetime 列中,在这种情况下 varchar(8) 将被隐式(并且正确地,最重要的是)转换为 datetime。不受支持的方式也不是我的,它是基于日期时间存储格式规范的“众所周知”。尽管使用了许多函数,但它的速度要快得多,因为它不涉及任何字符串解析。
    【解决方案2】:
    declare @originalDate datetime
    select @originalDate = '2009-06-24 09:52:43.000'
    
    declare @withoutTime datetime
    select @withoutTime = dateadd(d, datediff(d, 0, @originalDate), 0)
    
    select @withoutTime
    

    【讨论】:

    • 这是一个酷而优雅的解决方案......但它仅在输入值实际上是日期时间时才有效。如果您从字符串 (varchar) 开始,则必须先将其转换为日期时间,而以 100% 的准确率执行此操作是编程中最令人头疼的问题之一。
    【解决方案3】:
    SELECT CAST(CONVERT(VARCHAR,GETDATE(),102) AS DATETIME)
    
    SELECT CAST(CONVERT(VARCHAR(10),'2009-06-24 09:52:43.000',102) AS DATETIME)
    

    【讨论】:

      【解决方案4】:

      我发现先转换为日期,然后转换为日期时间非常有效且直观。

       SELECT CAST(CAST(GETDATE() as date) as datetime)
      

      【讨论】:

        【解决方案5】:

        对不受支持版本的增强: 我不确定这是否会影响任何性能。 getdate() 是我查询中的输入时间戳。

        select cast(cast(getdate() as DATE) as DATETIME)

        【讨论】:

          【解决方案6】:

          詹姆斯是对的。如果您从字符串开始,并且格式将始终如您所说,那么您要保持简单和高效。将LEFT( @StrDate, 10)CONVERT 用于您的日期时间值。完成。

          如果您的输入字符串可以是任何有效的日期/时间格式,那么您必须首先使用CONVERT(datetime, @StrDate)。之后,您按照 Bing 刚刚所说的方式去除时间部分。

          【讨论】:

            【解决方案7】:

            如果您将始终使用相同格式的日期,即 yyyy-MM-DD,您可以获取前 10 个字符(如果该值)并插入该日期的 00:00:00.0000 时间的等效值。

            select left('2009-12-32 4:32:00',10)
            

            这是一种非常有效的方法,因为它不需要转换数据类型。但是,它确实要求日期始终使用四位数的年份和两位数的日期和月份进行格式化。

            【讨论】:

              【解决方案8】:

              将其转换为日期,然后您可以使用 CONVERT 来获取日期。

              INSERT MyTable(Column1)
              SELECT CONVERT(CHAR(8), CAST('2009-06-24 09:52:43.000' AS DATETIME), 112)
              

              【讨论】:

              • 各位,为什么都用101格式?它取决于语言环境,只有在 EN-US 语言环境下才可以。在 EN-GB 下,它已经不像在英国那样是 dd/mm/yyyy,而不是 mm/dd/yyyy。使用 112,它不依赖任何东西。
              • 我同意不要使用 101,使用 112 aka ISO 或 102 ANSI。
              • 我同意 - 我通常使用 112 进行开发,但在运行示例代码时,输​​出中的 101 通常看起来更具可读性。
              • 更新了使用 ISO 日期的答案,使其在美国以外的地区更加友好。
              【解决方案9】:

              这可能是一种更清洁、更便携的方式,但我多年的习惯用法是:

              insert into tbl (date_column)
              select convert(varchar, convert (datetime, '2009-06-24 09:52:43.000'), 101)
              

              【讨论】:

                【解决方案10】:

                各种黑客:

                • 将您的字符串转换为日期时间,然后再次使用可选的“样式”参数返回convert,以仅使用日期部分将您的日期时间转换为字符串
                • 使用substring 砍掉结尾
                • 使用floor 对日期时间进行四舍五入

                【讨论】:

                  【解决方案11】:

                  剥离时间,并将其转换为日期:

                  select cast(left(yourstring, 10) as datetime)
                  

                  【讨论】:

                  • 这依赖于日期优先格式的时间格式。您不能假设这在所有字符串日期时间格式中都是正确的。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-03-25
                  • 2014-02-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多