sql-server - 将 datetimeoffset 转换为 varchar

标签 sql-server t-sql sql-server-2016

我已经到处搜索,但似乎找不到此信息,并且它没有在 CONVERT 的 MS 文档中列出(据我所知)。 .

给定日期/时间/偏移量:1997-12-31 14:53:00.123 +04:30

很容易将其转换到 datetimeoffset(3)CONVERT( datetimeoffset(3), '1997-12-31 14:53:00.123 +04:30' )

但将其从 datetimeoffset(3) 转换而来回到正文并不那么简单。

DECLARE @DateTimeOffset datetimeoffset(3) = '1997-12-31 14:53:00.123 +04:30';
DECLARE @StringDTO varchar(255) = CONVERT( nvarchar, @DateTimeOffset, 121 );
SELECT @StringDTO;

我能找到的两种最接近的样式是 121127 :

  • 121返回1997-12-31 14:53:00.1230000 +0缺少实际的时区值
  • 127返回1997-12-31T10:23:00.1230000Z这会将所有内容转换为祖鲁时间。

有谁知道 yyyy-mm-dd hh:mi:ss.fff +zz:zz 的转换方式吗?/1997-12-31 14:53:00.123 +04:30请问?

我可以轻松地推出自己的函数,但在执行此操作之前想确认 SQL Server 中不存在现有函数。

非常感谢。

最佳答案

这很奇怪,因为样式 121 works for me 。不过您可以随时尝试format例如

DECLARE @DateTimeOffset datetimeoffset(3) = '1997-12-31 14:53:00.123 +04:30';

SELECT
    CONVERT(NVARCHAR, @DateTimeOffset, 121)
    , FORMAT(@DateTimeOffset, 'yyyy-MM-dd HH:mm:ss.fff zzz');

Convert 的性能更好,所以如果可以的话请使用它。

然而,进一步查看您的数据,问题在于您实际上必须使用 datetimeoffset(6) 才能将秒小数保留到小数点后 6 位。此时,您超出了默认的 nvarchar 长度 30。

因此指定大小可以解决这个问题。

DECLARE @DateTimeOffset datetimeoffset(6) = '1997-12-31 14:53:00.123 +04:30';

SELECT
    CONVERT(NVARCHAR(255), @DateTimeOffset, 121)
    , FORMAT(@DateTimeOffset, 'yyyy-MM-dd HH:mm:ss.fff zzz');

当然,最佳实践是始终在 SQL Server 中定义字符串的长度。

关于sql-server - 将 datetimeoffset 转换为 varchar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65823243/

相关文章:

sql - "association table"的正确名称是什么(多对多关系)

sql - 将 smalldatetime 数据类型转换为 varchar 数据类型

sql - 将列中的 XML 节点连接到另一个表中的字段

t-sql - SQL Server 链接服务器错误

sql - 计算连续天数 SQL Server

sql - 为什么我的不相关子查询这么慢?

sql - Sql Server 2016 中 INSERT SELECT UNION ALL 的原子性

c# - 无法绑定(bind)多部分标识符 "sxxx@yahoo.com"

sql - SQL中的父子记录关系?

sql-server - 卸载 SQL Server 2016