完全按原样将 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