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将字符串转换为日期/日期时间的主要内容,如果未能解决你的问题,请参考以下文章