【问题标题】:Convert dd/mm/yyyy hh:mm:ss am/pm to yyyy/mm/dd hh:mm:ss将 dd/mm/yyyy hh:mm:ss am/pm 转换为 yyyy/mm/dd hh:mm:ss
【发布时间】:2022-01-17 02:49:27
【问题描述】:

我需要在 SQL Server 2019 中将“13/10/2021 09:38:20 PM”转换为“2021/10/13 21:38:20”。我已经在互联网上查找了相同的信息,但我可以找不到解决办法。请帮帮我。

【问题讨论】:

  • 使用convert()
  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。

标签: sql sql-server tsql datetime sql-server-2019


【解决方案1】:

为什么你从一个糟糕的区域格式开始?为什么要关心 SQL Server 提供的格式?让 SQL Server 解释模棱两可的区域格式并提供适当的日期时间数据类型(或者,更好的是,修复源,使其一开始就不会提供模棱两可的格式)。如果您想将其呈现为 yyyy/mm/dd 24:nn:ss 之类的内容,请让呈现层执行此操作。

也就是说,你可以这样做:

DECLARE @BadDateString varchar(32) = '13/10/2021 09:38:20 PM',
        @SaneOutput    datetime;

SET @SaneOutput = CONVERT(datetime, @BadDateString, 103);

SELECT SaneOutput = @SaneOutput,
       BadOutput  = CONVERT(char(11), @SaneOutput, 111)
                  + CONVERT(char(8),  @SaneOutput, 108);

输出:

SaneOutput BadOutput
2021-10-13 21:38:20.000 2021/10/13 21:38:20

This is complex 因为您想要的格式本身不可用(好吧,除非您使用我相信有人会推荐的extremely expensive FORMAT() function)。更多关于Dating Responsibly here的信息。

【讨论】:

    【解决方案2】:

    由于您必须从一种格式转换为另一种格式,首先您必须转换为日期时间数据类型,然后应用自定义格式,如下所示:

    DECLARE @datestring VARCHAR(50) = '13/10/2021 09:38:20 PM'
    SELECT FORMAT(CONVERT(DATETIME,@datestring,103),'yyyy/MM/dd HH:mm:ss')
    

    2021/10/13 21:38:20

    参考文献

    CAVEAT:使用“FORMAT”很昂贵。所以,做出相应的决定。 FORMAT is expensive

    【讨论】:

    • 不要忘记这个参考,它显示了format 在规模上的糟糕程度:sqlperformance.com/2015/06/t-sql-queries/…
    • @AaronBertrand,明白了。这非常贵。感谢您的启发性帖子。我已经更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2019-06-18
    • 2018-10-28
    • 2017-05-18
    相关资源
    最近更新 更多