【问题标题】:Need only Date from DateTime只需要来自 DateTime 的日期
【发布时间】:2010-11-10 14:55:29
【问题描述】:

我在 SQL 中有一个 DateTime 类型的变量。 只需要 Date 的一部分。

请帮忙?

【问题讨论】:

  • 以后请说明您正在使用的数据库引擎和版本。

标签: sql-server tsql datetime date


【解决方案1】:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

结果是:“2009-07-14 00:00:00.000”

编辑:猜测下一个变种更常见:

SELECT DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)

因为day 模式可以轻松更改为weekmonth 模式。当GROUP BY 子句按月(报告)分组时,它非常有用。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    使用Google找到这个

    SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, GETDATE())))

    【讨论】:

    • 我确实觉得这很有趣,但现在真的有人需要 Google 的链接吗? :-D
    • 有些人显然是这样做的:-D。
    • @tags2k & Colin:我应该说我在将我的问题放到 stackoverflow 之前用谷歌搜索过,但我没有找到任何解决我的问题的方法。如果您在上述查询中将日期时间值替换为 GETDATE() (并且时间部分在末尾使用 ب.ظ 或 ق.ظ ),您的查询将无法正确执行。这是因为我把问题放在这里。无论如何谢谢。
    • 在我看来,转换为浮点数是不好的做法,因为到日期时间的往返转换是不可靠的。请参阅this post for more detail
    【解决方案4】:

    如果您只需要日期的 varchar 表示,您可以使用 convert 函数,例如

    select convert(varchar, getDate(), 102) /* 2009.07.14 */
    

    如果您需要日期时间(给定日期的午夜),您可以将其转换回来。

    select convert(datetime, convert(varchar, getDate(), 102), 102)
    

    【讨论】:

    【解决方案5】:
    -- Sneaky CAST/DATEDIFF trick strips off the time to get just the day (midnight)!
    CAST(DATEDIFF(d,0,DateField) AS DATETIME) AS DayField
    

    【讨论】:

      【解决方案6】:

      SQL Server 2008 有一个日期数据类型,它只存储日期,如果你在这个版本中,也许这会是一个更好的数据类型供你使用。但请注意,Date 的工作方式与数据操作的日期时间不同。

      【讨论】:

        【解决方案7】:
        SELECT DATEADD(day, DATEDIFF(day, '19900101', CURRENT_TIMESTAMP), '19900101')
        

        一篇很有用的文章: “本文的目的是解释日期时间类型在 SQL Server 中的工作原理,包括常见的陷阱和一般建议。”The ultimate guide to the datetime datatypes

        请注意,转换为 varchar 并返回 (convert(datetime, convert(varchar, getDate(), 102), 102)) 要慢得多。

        【讨论】:

          【解决方案8】:

          如果您想要格式 'MM/DD/YY',请使用 "CONVERT(varchar, @datetimevalue, 1) 仅显示日期。如果您需要日期时间格式,请使用 "CONVERT(datetime, CONVERT(varchar , @datetimevalue, 1))"。

          我在我的 SQL 博客中创建了一个关于如何检索和显示 CONVERT(varchar, ..) 函数的所有可能格式的条目:

          http://jessesql.blogspot.com/2009/04/converting-datetime-values-to-varchar.html

          【讨论】:

          【解决方案9】:

          提示: 如果您发现自己经常这样做,您可以创建一个标量用户定义函数,其中包含您选择的时间剥离逻辑。

          请注意:SQL Server 2000 在ON 子句中存在一些涉及 UDF 的痛苦错误。

          【讨论】:

          • 为什么是标量?内联的表现要好得多。
          • 非常正确。确定性 CLR UDF 可能更有效,但我自己从未对此进行过测试,也无法通过 Google 找到任何东西。
          • 使用 UDF 很方便,但实践不佳,因为与正确查询相比,它会降低性能。
          • 我认为说它会“扼杀性能”有点夸张。可以肯定的是,有一个惩罚,但这是一个很小的惩罚。在这种情况下,在一个微妙的习语中犯错误可能比进行性能测试更昂贵。换句话说,正确的分析比担心假设的性能问题重要一千倍。我会说,避开提供有用抽象并有助于确保正确性的工具是“糟糕的做法”。 SQL 速度迷可能不同意。
          【解决方案10】:

          日期部分(天,日期时间值)

          【讨论】:

          • 只给出一个月中的哪一天,例如今天是 7 月 16 日,所以 datepart(day, getdate()) 将返回 16。我认为他想要 '2009-07-16'而是。
          • 完整语法是 datepart(Year|Day|Month|Hour|...., datetimevalue)。他可以得到零件并开卡车.....
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多