从字符串转换日期和/或时间并从日期中提取季度/年时转换失败
Posted
技术标签:
【中文标题】从字符串转换日期和/或时间并从日期中提取季度/年时转换失败【英文标题】:Conversion failed when converting date and/or time from character string and pull Quarter/Year from Date 【发布时间】:2019-12-02 16:54:31 【问题描述】:我有一个大整数日期列,不接受空值。列中值的日期格式是 20190101。我需要一个告诉我年份和季度的查询。谷歌搜索后,我发现了一个有效的查询。今天它不起作用。我在查询中收到此错误“从字符串转换日期和/或时间时转换失败”。我跟踪了表格的原因,在某些行上允许 -1。如何在我的查询中允许这样做?我想我必须把它转换成一个角色才能拉出宿舍。我使用演员表做到了这一点。我更改为日期时间,它说指定的比例无效。
这是我的查询:
Select Distinct left(DateKey,4) as Year,
DatePart(QUARTER,cast(cast(DateKey as char(8)) as date)) As Quarter
From WorkersUnitePerformanceFact
Order By Year, Quarter
选择中的两个项目都收到错误。
【问题讨论】:
如果您运行CAST(GETDATE() AS char(8))
,您会很快看到为什么会出现错误:DB<>Fiddle
如何将您的日期存储在 DATE/DATETIME 等类型的列中?将它们存储在整数中并希望它们始终可以转换为日期是自找麻烦
【参考方案1】:
您是说有人在您的列中插入了 -1,这让您感到困惑。虽然这些数据原本应该在某种日期列中,这使问题更加复杂,但您可以考虑过滤掉不需要的值:
Select Distinct left(DateKey,4) as Year,
DatePart(QUARTER,cast(cast(DateKey as char(8)) as date)) As Quarter
From Performance.WorkerPerformanceFact
WHERE DateKey BETWEEN 19700101 and 21991231
Order By Year, Quarter
调整 WHERE 子句以满足您对日期范围的需求。我选择了 1970 年 1 月 1 日和 2199 年 12 月 31 日
但是认真考虑现在改变列的数据类型(你离开的时间越长,它就越难......);我保证这不会是最后一次咬你的***;下次它会是另一个问题,比如有人插入 20200230(没有 2 月 30 日),你不应该一直试图过滤掉无效值
转换为日期的过程不一定是即时的;您可以向表中添加另一个 DATE 类型列,开始使用 DATEKEY 列中的触发器填充它,将应用程序切换为使用日期列,然后稍后删除 DATEKEY 列(保留一段时间,从真实日期填充列)贯穿应用程序多次修订的整个过程
【讨论】:
我正在向开发和系统分析师提交更改请求,不幸的是我只是测试人员,所以最终决定不取决于我。非常感谢你的帮助。这很完美。【参考方案2】:将值转换为字符串,然后是日期:
convert(date, convert(varchar(255), 20190101))
然后您可以使用datename()
构造年份/夸脱:
select (datename(year, convert(date, convert(varchar(255), 20190101))) + 'Q' +
datename(quarter, convert(date, convert(varchar(255), 20190101)))
)
【讨论】:
这行得通,如果这是一个幼稚的问题,请原谅我,但它只会检索 1 月 1 日的日期。我有很多日期,但这是我需要的格式。如果有办法检索所有年份的所有日期?我尝试了 yyyymmdd,但它也收到了转换失败,并且空白给出了一个错误,期待其他东西以上是关于从字符串转换日期和/或时间并从日期中提取季度/年时转换失败的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 无法使用有效字符串将字符串转换为日期时间