完全按原样将 Datetime 转换为 Varchar

Posted

技术标签:

【中文标题】完全按原样将 Datetime 转换为 Varchar【英文标题】:Convert Datetime to Varchar exactly as is 【发布时间】:2014-10-21 17:15:46 【问题描述】:

我正在尝试将日期时间完全转换为 varchar。

所以我想要以下内容:

SELECT CONVERT(varchar(30),'2014-10-21 12:02:22.555')

每次都准确返回 2014-10-21 12:02:22.555。我对此进行了一些研究,但我看不出将完整日期转换为 varchar 这样的选项有什么不同。仅使用基本的 convert(varchar(30),最后没有选项,这是否适用于所有日期?

【问题讨论】:

为什么需要这样做?这听起来应该是您的演示代码而不是 SQL 的问题。 在您的问题中,您将字符串转换为VARCHAR(30),这没有任何意义(或者更确切地说,它什么都不做)。您的意思是将字符串转换为DATETIME,反之亦然? 我实际上是在不支持传入日期时间的 hashbytes 函数中使用它,所以我需要对其进行转换。 SELECT HASHBYTES('md5',Datetime) 失败 啊哈,现在这是一个完全不同的问题。您可能希望对其进行编辑以使其清晰。 HASHBYTES 确实对二进制数据进行操作,所以一个简单的 CONVERT(BINARY(8), datetime) 应该可以。 我正在一次将多个列添加到持久计算列中。这就是我寻找 varchar 值的原因。下面的答案正是我所需要的。 【参考方案1】:

“完全一样”并不正确 - something stored in the DATETIME format is actually stored as two integers。当您选择它时,您看到的实际上只是这两个整数,以某种方式格式化。这样做的好处是许多应用程序可以识别 DATETIME 数据类型,并允许您使用无法应用于字符字段的函数和格式(例如 DATENAME、DATEADD 等)

要将其转换为 SQL Server Management Studio 将显示的默认格式的 varchar,您可以使用 format code 121,如下所示:

SELECT CONVERT(VARCHAR(30), GETDATE(),121)

这将返回 2014-10-21 13:24:31.353,这与 SSMS 默认显示的格式相同。

【讨论】:

【参考方案2】:

这是所有样式的一些测试 sql。使 nvarchar(max) 更短以修剪(例如 nvarchar(10))。

 DECLARE @now datetime
    SET @now = GETDATE()
    select convert(nvarchar(MAX), @now, 0) as output, 0 as style 
    union select convert(nvarchar(MAX), @now, 1), 1
    union select convert(nvarchar(MAX), @now, 2), 2
    union select convert(nvarchar(MAX), @now, 3), 3
    union select convert(nvarchar(MAX), @now, 4), 4
    union select convert(nvarchar(MAX), @now, 5), 5
    union select convert(nvarchar(MAX), @now, 6), 6
    union select convert(nvarchar(MAX), @now, 7), 7
    union select convert(nvarchar(MAX), @now, 8), 8
    union select convert(nvarchar(MAX), @now, 9), 9
    union select convert(nvarchar(MAX), @now, 10), 10
    union select convert(nvarchar(MAX), @now, 11), 11
    union select convert(nvarchar(MAX), @now, 12), 12
    union select convert(nvarchar(MAX), @now, 13), 13
    union select convert(nvarchar(MAX), @now, 14), 14
    --15 to 19 not valid
    union select convert(nvarchar(MAX), @now, 20), 20
    union select convert(nvarchar(MAX), @now, 21), 21
    union select convert(nvarchar(MAX), @now, 22), 22
    union select convert(nvarchar(MAX), @now, 23), 23
    union select convert(nvarchar(MAX), @now, 24), 24
    union select convert(nvarchar(MAX), @now, 25), 25
    --26 not valid
    union select convert(nvarchar(MAX), @now, 100), 100
    union select convert(nvarchar(MAX), @now, 101), 101
    union select convert(nvarchar(MAX), @now, 102), 102
    union select convert(nvarchar(MAX), @now, 103), 103
    union select convert(nvarchar(MAX), @now, 104), 104
    union select convert(nvarchar(MAX), @now, 105), 105
    union select convert(nvarchar(MAX), @now, 106), 106
    union select convert(nvarchar(MAX), @now, 107), 107
    union select convert(nvarchar(MAX), @now, 108), 108
    union select convert(nvarchar(MAX), @now, 109), 109
    union select convert(nvarchar(MAX), @now, 110), 110
    union select convert(nvarchar(MAX), @now, 111), 111
    union select convert(nvarchar(MAX), @now, 112), 112
    union select convert(nvarchar(MAX), @now, 113), 113
    union select convert(nvarchar(MAX), @now, 114), 114
    union select convert(nvarchar(MAX), @now, 120), 120
    union select convert(nvarchar(MAX), @now, 121), 121
    --122 to 125 not valid
    union select convert(nvarchar(MAX), @now, 126), 126
    union select convert(nvarchar(MAX), @now, 127), 127
    --128, 129 not valid
    union select convert(nvarchar(MAX), @now, 130), 130
    union select convert(nvarchar(MAX), @now, 131), 131
    --132 not valid
    order BY style

这是结果

output                   style
Apr 28 2014  9:31AM          0
04/28/14                     1
14.04.28                     2
28/04/14                     3
28.04.14                     4
28-04-14                     5
28 Apr 14                    6
Apr 28, 14                   7
09:31:28                     8
Apr 28 2014  9:31:28:580AM   9
04-28-14                     10
14/04/28                     11
140428                       12
28 Apr 2014 09:31:28:580     13
09:31:28:580                 14
2014-04-28 09:31:28          20
2014-04-28 09:31:28.580      21
04/28/14  9:31:28 AM         22
2014-04-28                   23
09:31:28                     24
2014-04-28 09:31:28.580      25
Apr 28 2014  9:31AM          100
04/28/2014                   101
2014.04.28                   102
28/04/2014                   103
28.04.2014                   104
28-04-2014                   105
28 Apr 2014                  106
Apr 28, 2014                 107
09:31:28                     108
Apr 28 2014  9:31:28:580AM   109
04-28-2014                   110
2014/04/28                   111
20140428                     112
28 Apr 2014 09:31:28:580     113
09:31:28:580                 114
2014-04-28 09:31:28          120
2014-04-28 09:31:28.580      121
2014-04-28T09:31:28.580      126
2014-04-28T09:31:28.580      127
28 جمادى الثانية 1435  9:31:28:580AM    130
28/06/1435  9:31:28:580AM    131

参考页面link

【讨论】:

以上是关于完全按原样将 Datetime 转换为 Varchar的主要内容,如果未能解决你的问题,请参考以下文章

无法将参数值从 String 转换为 DateTime 的 Int32

在 DataGridView 中显示之前将时间戳(Datetime.ticks)从数据库转换为 Datetime 值

从 SQL 数据库导入表并按日期过滤行时,将 Pandas 列解析为 Datetime

从 SQL 数据库导入表并按日期过滤行时,将 Pandas 列解析为 Datetime

按日期对数据进行分组并将DateTime转换为Double

Unity c#以所需的日期时间格式将date-string转换为datetime对象