【问题标题】:How to get a date in YYYY-MM-DD format from a TSQL datetime field?如何从 SQL 日期时间字段中获取 YYYY-MM-DD 格式的日期?
【发布时间】:2010-10-27 17:45:16
【问题描述】:

如何从 SQL Server 中检索 YYYY-MM-DD 格式的日期?我需要它来使用 SQL Server 2000 及更高版本。是否有一种简单的方法可以在 SQL Server 中执行此操作,或者在检索结果集后以编程方式对其进行转换是否更容易?

我已阅读 Microsoft Technet 上的 CAST and CONVERT,但未列出我想要的格式,并且无法更改日期格式。

【问题讨论】:

  • 126 的 BOL 描述有点混乱(从未找到“T”的解释)。
  • “T”将日期与时间分开。 See ISO 8601 on Wikipedia

标签: sql-server tsql


【解决方案1】:

由于字符串处理很昂贵,而 FORMAT 更是如此,我很惊讶 Asher/Aaron Dietz 的响应没有更高,如果不是最高的话;问题是寻求 ISO 8601 日期,并没有明确要求它作为字符串类型。

最有效的方法是以下任何一种(我已经包含了 Asher/Aaron Dietz 已经建议完整性的答案):

所有版本

select  cast(getdate() as date)
select  convert(date, getdate())

2008 年及更高版本

select  convert(date, current_timestamp)

ANSI SQL 等效 2008 及更高版本

select  cast(current_timestamp as date)

参考资料:

https://sqlperformance.com/2015/06/t-sql-queries/format-is-nice-and-all-but

https://en.wikipedia.org/wiki/ISO_8601

https://www.w3schools.com/sql/func_sqlserver_current_timestamp.asp

https://docs.microsoft.com/en-us/sql/t-sql/functions/current-timestamp-transact-sql?view=sql-server-ver15

【讨论】:

    【解决方案2】:

    如果你希望你的日期用斜线分隔,似乎没有必要做任何奇怪的事情。 只需用反斜杠转义它。否则你会得到一个点。

    SELECT FORMAT(GETDATE(),'yyyy\/MM');  
    

    在 SQL Server 2016 上测试

    【讨论】:

    • 你应该测试它的性能。 FORMAT 通常比复杂的 CONVERT 慢 43 倍。
    【解决方案3】:

    我不确定为什么在上面的答案中忽略/省略了最简单的方法:

    SELECT FORMAT(GetDate(),'yyyy-MM-dd');--= 2020-01-02
    
    SELECT FORMAT(GetDate(),'dd MMM yyyy HH:mm:ss');-- = 02 Jan 2020 08:08:08
    

    我更喜欢第二种,因为无论您说哪种语言,您都会明白日期!

    此外,当您将其发送到保存过程时,SQL Server 总是“理解”它,无论计算机中设置了哪种区域格式 - 我总是使用全年 (yyyy)、月份名称 (MMM) 和 24 小时格式 (大写 HH) 在我的编程中一个小时。

    【讨论】:

      【解决方案4】:

      您也可以使用。这是通过使用新的数据类型DATE。可能不适用于所有以前的版本,但在以后的版本中大大简化了使用。

      SELECT CAST(getdate() AS DATE)
      SELECT LEFT(CAST(getdate() AS DATE), 7)
      

      【讨论】:

        【解决方案5】:

        从 SQL Server 2008 开始,您可以这样做:CONVERT(date,getdate())

        【讨论】:

          【解决方案6】:
           IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);
          
          cmdGetPaymentStatement.Parameters.AddWithValue("@pStartDate", DateTime.Parse("22/12/2017", culture, System.Globalization.DateTimeStyles.AssumeLocal)).IsNullable = true;
          

          【讨论】:

          • 上面的代码用于为参数提供一个存储过程,格式为mm/dd/yyyy
          【解决方案7】:

          如果您的源日期格式完全混乱,请尝试以下方式:

          select
          convert(nvarchar(50),year(a.messedupDate))+'-'+
          (case when len(convert(nvarchar(50),month(a.messedupDate)))=1 
              then '0'+ convert(nvarchar(50),month(a.messedupDate))+'-' 
              else convert(nvarchar(50),month(a.messedupDate)) end)+
          (case when len(convert(nvarchar(50),day(a.messedupDate)))=1 
              then '0'+ convert(nvarchar(50),day(a.messedupDate))+'-'
              else convert(nvarchar(50),day(a.messedupDate)) end) 
          from messytable a
          

          【讨论】:

            【解决方案8】:

            这个解决方案对我有用,简单有效(126 也是)

            CONVERT(NVARCHAR(MAX), CAST(GETDATE() as date), 120)
            

            【讨论】:

              【解决方案9】:

              对于那些也想要时间部分的人(我做过),以下 sn-p 可能会有所帮助

              SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
              SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
              SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                                            --example -- 2008-10-02T10:52:47.513
              

              【讨论】:

                【解决方案10】:

                对每个转换/转换函数使用 CASE 语句总是对我有用:

                请将 tableXXXXY 替换为您的表名,并将 issueDate_dat 替换为该表中您的日期时间字段的名称:

                SELECT  issueDate_dat, CONVERT(varchar, DATEPART(yyyy, issuedate_dat))  AS issueDateYYYY
                , CASE WHEN (len(CONVERT(varchar, DATEPART(mm, issuedate_dat))) < 2) THEN '0' +CONVERT(varchar, DATEPART(mm, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(mm, issuedate_dat)) END AS  issueDateMM
                , CASE WHEN (len(CONVERT(varchar, DATEPART(dd, issuedate_dat))) <2) THEN '0' +CONVERT(varchar, DATEPART(dd, issuedate_dat)) ELSE CONVERT(varchar, DATEPART(dd, issuedate_dat)) END AS issueDateDD
                FROM            tableXXXXY
                

                希望这对您有所帮助。查格伯特。

                【讨论】:

                  【解决方案11】:
                  SELECT convert(varchar, getdate(), 100) -- mon dd yyyy hh:mmAM
                  
                  SELECT convert(varchar, getdate(), 101) -- mm/dd/yyyy – 10/02/2008                  
                  
                  SELECT convert(varchar, getdate(), 102) -- yyyy.mm.dd – 2008.10.02           
                  
                  SELECT convert(varchar, getdate(), 103) -- dd/mm/yyyy
                  
                  SELECT convert(varchar, getdate(), 104) -- dd.mm.yyyy
                  
                  SELECT convert(varchar, getdate(), 105) -- dd-mm-yyyy
                  
                  SELECT convert(varchar, getdate(), 106) -- dd mon yyyy
                  
                  SELECT convert(varchar, getdate(), 107) -- mon dd, yyyy
                  
                  SELECT convert(varchar, getdate(), 108) -- hh:mm:ss
                  
                  SELECT convert(varchar, getdate(), 109) -- mon dd yyyy hh:mm:ss:mmmAM (or PM)
                  
                  SELECT convert(varchar, getdate(), 110) -- mm-dd-yyyy
                  
                  SELECT convert(varchar, getdate(), 111) -- yyyy/mm/dd
                  
                  SELECT convert(varchar, getdate(), 112) -- yyyymmdd
                  
                  SELECT convert(varchar, getdate(), 113) -- dd mon yyyy hh:mm:ss:mmm
                  
                  SELECT convert(varchar, getdate(), 114) -- hh:mm:ss:mmm(24h)
                  
                  SELECT convert(varchar, getdate(), 120) -- yyyy-mm-dd hh:mm:ss(24h)
                  
                  SELECT convert(varchar, getdate(), 121) -- yyyy-mm-dd hh:mm:ss.mmm
                  
                  SELECT convert(varchar, getdate(), 126) -- yyyy-mm-ddThh:mm:ss.mmm
                  

                  【讨论】:

                  • 谢谢,只需将 'yyyy-mm-dd' 部分更改为 'yyyy-MM-dd'。
                  • @MohsenNajafzadeh 在这种情况下,Imran 只是将日期格式字符串列为注释,因此月份是否大写无关紧要;读者应该知道,这里指的是“月”,而不是问题上下文中的“分钟”。
                  【解决方案12】:

                  SQL Server 2012 开始(最初的问题是针对 2000 年的):

                  SELECT FORMAT(GetDate(), 'yyyy-MM-dd')

                  【讨论】:

                  • 这是在使用 Dotnet 标准格式的最新 SQL 版本中执行日期/时间的明智灵活的方法。请记住将月份 MM 大写以区别分钟。 All date time formats
                  • FORMAT 运行(通常)比 CONVERT 慢 43 倍。我强烈建议您永远不要(而且我不经常使用这个词)使用 FORMAT。
                  【解决方案13】:

                  带有格式说明符 120 的 convert 函数将为您提供格式“yyyy-MM-dd HH:mm:ss”,因此您只需将长度限制为 10 即可仅获取日期部分:

                  convert(varchar(10), theDate, 120)
                  

                  但是,格式化日期通常在表示层而不是在数据库或业务层中进行。如果您返回从数据库格式化的日期,则客户端代码必须再次将其解析为日期,以便对其进行任何计算。

                  C# 中的示例:

                  theDate.ToString("yyyy-MM-dd")
                  

                  【讨论】:

                  • 为什么投反对票?如果你不解释你认为错的地方是什么,它就无法改进答案。
                  【解决方案14】:

                  对于 YYYYMMDD 试试

                  select convert(varchar,getDate(),112)
                  

                  我只在 SQLServer2008 上测试过。

                  【讨论】:

                    【解决方案15】:

                    如果有人想以其他方式这样做并找到它。

                    select convert(datetime, '12.09.2014', 104)
                    

                    这会将德语日期格式的字符串转换为日期时间对象。

                    为什么是 104? 请看这里:http://msdn.microsoft.com/en-us/library/ms187928.aspx

                    【讨论】:

                      【解决方案16】:
                      replace(convert(varchar, getdate(), 111), '/','-')
                      

                      在不“砍掉任何东西”的情况下也能耍花招。

                      【讨论】:

                      • 我更喜欢这个版本以避免与 convert(varchar(10)...) 版本相关的“9999 年”错误。
                      【解决方案17】:

                      SELECT CONVERT(NVARCHAR(20), GETDATE(), 23)

                      【讨论】:

                      • 为什么使用 NVARCHAR(20)?里面会不会有特殊字符?
                      • 我不喜欢使用 UNICODE。我的大部分项目都是国际化的 ;-)
                      【解决方案18】:

                      另一种方式...

                      CONVERT(varchar, DATEPART(yyyy, @datetime)) + '/' + CONVERT(varchar, DATEPART(mm, @datetime)) + '/' + CONVERT(varchar, DATEPART(dd, @datetime)) 
                      

                      【讨论】:

                      • 这将创建 1 位数的日期,如 2012 年 8 月 3 日,如果您想要 2 位数的 mm/dd,您需要在左侧填充日期。 RIGHT('00' + CONVERT(varchar, DATEPART(yyyy, @datetime)), 2) 例如
                      【解决方案19】:
                      SELECT Code,Description FROM TABLE
                      
                      -- This will Include only date part of 14th March 2010. Any date with date companents will not be considered.
                      WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate <= DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))
                      
                      -- This will Include the whole day of 14th March 2010
                      --WHERE ID= 1 AND FromDate >= CONVERT(DATETIME, '2010-02-14', 126) AND ToDate < DATEADD(dd, 1, CONVERT(DATETIME, '2010-03-14', 126))
                      

                      【讨论】:

                        【解决方案20】:

                        如果您想在之后再次将其用作日期而不是 varchar,请不要忘记将其转换回来:

                        select convert(datetime,CONVERT(char(10), GetDate(),126))
                        

                        【讨论】:

                        • 这不会将其转换回系统默认格式吗?
                        【解决方案21】:
                        SELECT CONVERT(char(10), GetDate(),126)
                        

                        限制您不想要的小时部分的 varchar 印章的大小。

                        【讨论】:

                        • 否,但有些客户在固定长度方面存在问题。
                        • 这篇文章出现在谷歌中,用于转换为 YYYYMMDD - 所以一个是:CONVERT(char(10), GetDate(),112)
                        • 这对我不起作用,上面带有代码 112 的建议可以。谢谢@NealWalters
                        • 输出样式的整数代码列表:msdn.microsoft.com/en-us/library/ms187928.aspx
                        • 代码 126 适用于日期,例如 YYYY-mm-dd 格式的出生日期:CONVERT(char(10), pat_dob , 126) as pat_dob
                        【解决方案22】:

                        我会使用:

                        CONVERT(char(10),GETDATE(),126)
                        

                        【讨论】:

                          【解决方案23】:

                          您所追求的表格列在书籍在线文档中。

                          http://msdn.microsoft.com/en-us/library/aa226054(SQL.80).aspx

                          例如,尝试以下操作:

                          select convert(varchar,getDate(),120)
                          select convert(varchar(10),getDate(),120)
                          

                          【讨论】:

                          • 如果您采用默认值,在这种情况下,您将获得时间值 - 格式 120 的整个格式为 'yyyy-mm-dd hh:mi:ss'。通过明确声明长度,它被修剪为您在原始注释中指定的格式 - 'yyyy-mm-dd'。
                          【解决方案24】:

                          在您的演员和转换链接中,使用样式 126:

                          CONVERT (varchar(10), DTvalue, 126)

                          这会截断时间。您要求它在 yyyy-mm-dd 中意味着它必须是字符串数据类型和日期时间。

                          但坦率地说,除非您有充分的理由不这样做,否则我会在客户端上这样做。

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 2015-11-18
                            • 1970-01-01
                            • 2016-01-02
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2014-07-12
                            • 1970-01-01
                            相关资源
                            最近更新 更多