从字符串转换日期和/或时间并从日期中提取季度/年时转换失败

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 无法使用有效字符串将字符串转换为日期时间

Postgres / Redshift:在一次调用中从组的日期列中提取季度和年份?

如何在 Python 中将日期转换为季度?

从日期时间对象中提取日期和月份

从日期字符串中提取时间