sql将字符串转换为日期/日期时间

Posted

技术标签:

【中文标题】sql将字符串转换为日期/日期时间【英文标题】:sql convert string to date/datetime 【发布时间】:2019-04-12 03:05:40 【问题描述】:

我的文件名列看起来像“D181115.T000000”。我用下面的代码把它变成了一个字符串,看起来像'2018-11-15'。

select '20' + substring(filename, 2,2) + '-' + substring(filename, 4,2) + '-' + substring(filename,6,2)
from table_name

那我想把字符串转成日期类型(因为我需要按日期排序)

select convert(datetime, '20 + substring(filename, 2,2) + '-' + substring(filename, 4,2) + '-' + substring(filename,6,2)')
from table_name

然后我收到此错误消息:

数据类型 varchar 和 varchar 在减法中不兼容 运算符。

任何帮助将不胜感激!

【问题讨论】:

您使用的是哪个 dbms? (这些查询是特定于产品的。) 你在'20后面少了一个单引号,那么它在做Substract操作:20 + substring(filename, 2,2) + 20 + substring(filename, 2,2) + ' 您使用的是 SQL Server 吗?在这种情况下,您可以只使用select cast('20' + substring('D181115.T000000', 2,6) as date)select try_cast('20' + substring('D181115.T000000', 2,6) as date)YYYYMMDD 是公认的、明确的日期文字。另一方面,YYYY-MM-DD 取决于 DATEFORMAT 设置 Then I want to convert the string to date type 您应该小心字符串到日期的转换。最好从日期/日期时间开始而不是字符串日期。您可能永远不知道字符串日期181115 以什么格式被解释为'2018-11-15''2018-15-11'。只是想一想。 【参考方案1】:

我怀疑数据库是 SQL Server。在这种情况下,可以只使用

select cast('20' + substring('D181115.T000000', 2,6) as date) 

select try_cast('20' + substring('D181115.T000000', 2,6) as date) 

YYYYMMDD 是两种明确的日期格式之一。另一种是完整的 ISO8601 日期+时间格式。另一方面,YYYY-MM-DD 取决于 DATEFORMAT 设置

更新

我建议将此转换作为数据加载的一部分进行。将函数应用于字段可防止服务器使用覆盖该字段的任何索引。服务器必须扫描整个表才能生成用于过滤和排序的最终值。

至少考虑添加一个生成文件日期的索引计算列

【讨论】:

感谢您的建议。我将使用 20181115 作为文件名。【参考方案2】:

我想把字符串转成日期类型

查看您包含的第一个和第二个语句,它们的不同之处在于您缺少一个引号,而您在第二个语句中添加了一个额外的引号。

declare @filename varchar(20) = 'D181115.T000000'
select convert(datetime, '20' + substring(@filename, 2,2) + '-' + substring(@filename, 4,2) + '-' + substring(@filename,6,2))

产生输出:

2018-11-15 00:00:00.000

【讨论】:

这是因为我按照示例 SELECT CONVERT(datetime, '2017-08-25');我觉得我好笨。感谢您的帮助!

以上是关于sql将字符串转换为日期/日期时间的主要内容,如果未能解决你的问题,请参考以下文章

SQL将日期时间转换为日期名称

sql server2000如何将数字转换为日期时间

SQL Server 将字符串转换为日期时间

SQL Server 将字符串转换为日期时间

Presto SQL - 将日期字符串转换为日期格式

sql怎么把字符串转换为日期格式