【问题标题】:sql server date in the format yyyy-MM-ddThh:mm:ssZsql server 日期格式为 yyyy-MM-ddThh:mm:ssZ
【发布时间】:2011-05-24 10:28:54
【问题描述】:

我需要将 SQL Server 中的一组日期格式化为以下格式..

yyyy-MM-ddThh:mm:ssZ

我似乎找不到如何使用字符串中包含的 T 和 Z 部分来格式化日期

任何想法如何在 SQL 查询中实现这种格式?

【问题讨论】:

标签: sql-server datetime format


【解决方案1】:

根据Cast and Convert 上的 SQL Server 2005 在线图书页面,您使用日期格式 127 - 如下例所示

CONVERT(varchar(50), DateValueField, 127)

SQL Server 2000 文档没有提及这种格式 - 也许它仅适用于 2005 及更高版本。

关于添加到末尾的时区的注释(来自文档中的注释 7):可选的时区指示符 Z 用于更轻松地将具有时区信息的 XML 日期时间值映射到 SQL Server 日期时间值没有时区。 Z 是时区 UTC-0 的指标。其他时区以 + 或 - 方向的 HH:MM 偏移量表示。例如:2006-12-12T23:45:12-08:00。

感谢 Martin 的说明:您应该能够使用 STUFF 删除毫秒,因为它们将位于字符串左侧的固定位置。即

SELECT STUFF(CONVERT(VARCHAR(50),GETDATE(), 127) ,20,4,'')

【讨论】:

  • 同意这就是文档所说的,但 SELECT CONVERT(VARCHAR(50), GETDATE(), 127) 在 SQL Server 2008 上为我返回 2011-05-24T11:39:30.330。(似乎与没有任何 Z 的 126 相同?)
  • OP 不询问毫秒。结果是 2011-05-24T16:14:33.830Z
  • 我同意 Pankaj,毫秒不在问题 sepc 中,但根据文档,这是包含时区的唯一格式。来自文档:'可选的时区指示符 Z 用于更轻松地将具有时区信息的 XML 日期时间值映射到没有时区的 SQL Server 日期时间值。 Z 是时区 UTC-0 的指标。其他时区以 + 或 - 方向的 HH:MM 偏移量表示。例如:2006-12-12T23:45:12-08:00。'
  • +1 您应该能够使用STUFF 删除毫秒,因为它们将位于字符串左侧的固定位置。即SELECT STUFF(CONVERT(VARCHAR(50),GETDATE(), 127) ,20,4,'')
  • 时区偏移如何? ;WITH c AS ( SELECT DATEDIFF(HOUR, GETUTCDATE(), GETDATE()) HH ) SELECT STUFF(CONVERT(VARCHAR(50), GETUTCDATE(), 127) + + CASE WHEN C.HH > 0 THEN '+' WHEN c.HH < 0 THEN '-' ELSE '' END + CASE WHEN c.hh < 9 THEN '0' ELSE '' END + CAST(C.HH AS NVARCHAR) + ':00', 20, 4, '') FROM c
【解决方案2】:

您可以使用以下方法在 SQL 中解析 C# 输出:

SELECT CONVERT(DATETIME, CONVERT(DATETIMEOFFSET,'2017-10-27T10:44:46Z'))

使用 C# 使用以下代码生成它:

string ConnectionString = "Data Source=SERVERNAME; Initial Catalog=DATABASENAME; Persist Security Info=True; User ID=USERNAME; Password=PASSWORD";

using(SqlConnection conn = new SqlConnection(ConnectionString))
{
    DateTime d = DateTime.Now;

    string Query = "SELECT CONVERT(DATETIME, CONVERT(DATETIMEOFFSET,'" + d.ToString("yyyy-MM-dd") + "T" + d.ToString("HH:mm:ss") + "Z'))"

    conn.Open();

    using(SqlCommand cmd = new SqlCommand(Query, conn))
    {
        using(SqlDataReader rdr = cmd.ExecuteReader())
        {
            if(rdr.HasRows)
            {
                while(rdr.Read())
                {
                    for(int i; i < rdr.length; i++)
                    {
                        Console.WriteLine(rdr[0].ToString());

                    }

                }

                //DataTable dt = new DataTable(); dt.Load(rdr); //Alternative method if DataTable preferred

            }

        }

    }

}

【讨论】:

    【解决方案3】:
    DECLARE @SampleDate DATETIME2(3) = '2020-07-05 23:59:59';
    SELECT CONVERT(VARCHAR(20), CONVERT(DATETIMEOFFSET, @SampleDate), 127);
    --results: 2020-07-05T23:59:59Z 
    

    【讨论】:

    • 这是对原始问题的真正答案。这是在转换中使用日期时间样式 127 时如何获取显示的时区。
    【解决方案4】:
    select left(convert(varchar(30),getdate(),126)+ '.000',23)    
    

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请编辑您的答案以添加解释,并说明适用的限制和假设。
    • 其实是我做了很久的代码。即使是我,我也不知道我是如何找到它的,但它 100% 有效。就是这样。谢谢。
    【解决方案5】:

    试试这个

     SELECT STUFF(
         CONVERT(datetime2(0), GETDATE(), 126)      
        AT TIME ZONE 'US Eastern Standard Time'   
        ,11,1,'T')
    

    【讨论】:

      【解决方案6】:

      在 MSSQL 上

      SELECT FORMAT( GETDATE(),'yyyy-MM-ddTHH:mm:ss.ms zzzz')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-07
        • 2017-02-03
        • 2018-02-21
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 2016-05-13
        相关资源
        最近更新 更多