Sql server 为什么我的WHERE子句不能将字段识别为日期,即使在将该字段从int转换为date之后也是如此?

Sql server 为什么我的WHERE子句不能将字段识别为日期,即使在将该字段从int转换为date之后也是如此?,sql-server,tsql,casting,where-clause,Sql Server,Tsql,Casting,Where Clause,我在SQL Server中执行了以下SELECT语句,这导致了错误: 将表达式转换为数据类型datetime时出现算术溢出错误 Id=唯一标识符 CalendarDate=int,我需要将其转换为日期 我做错了什么 我希望找到今天和6个月前之间的所有日期,但是我得到了提到的错误 感谢您的帮助 谢谢。尝试在WHERE子句中转换日期边框,如下所示: SELECT Id, CAST(CAST(CalendarDate as varchar(10)) as date) FROM dbo.Sales WH

我在SQL Server中执行了以下SELECT语句,这导致了错误:

将表达式转换为数据类型datetime时出现算术溢出错误

Id=唯一标识符

CalendarDate=int,我需要将其转换为日期

我做错了什么

我希望找到今天和6个月前之间的所有日期,但是我得到了提到的错误

感谢您的帮助


谢谢。

尝试在WHERE子句中转换日期边框,如下所示:

SELECT Id, CAST(CAST(CalendarDate as varchar(10)) as date)
FROM dbo.Sales
WHERE CalendarDate BETWEEN CAST(CONVERT(CHAR(8),dateadd(month,-6, GETDATE()),112)  AS INT) and CAST(CONVERT(CHAR(8),GETDATE(),112) AS INT)

因为Where子句是在select子句之前计算的,所以转换后的字段无法识别,因为它还不存在

查询的计算顺序如下所示:

SELECT语句的逻辑处理顺序以下步骤显示 SELECT语句。此顺序确定在中定义对象的时间 一个步骤可用于后续步骤中的子句。对于 例如,如果查询处理器可以绑定以访问表或 在FROM子句中定义的视图中,这些对象及其列是 可用于所有后续步骤。相反,因为 子句中定义的任何列别名或派生列 前面的条款不能引用该条款。但是, 可由后续子句(如ORDER by子句)引用。 语句的实际物理执行由 查询处理器和顺序可能与此列表不同

从…起 在…上 参加 哪里 分组 使用多维数据集还是使用汇总 有 选择 不同的 订购人 顶部
int和date/datetime是两种截然不同的类型。你希望它做什么转换?是的。您尝试比较的两种数据类型不同,不兼容。在CalendarDate列中有什么样的数据?正如我所写的,我希望从int到date。我还试着扮演datetime。还是不行。在CalendarDate列中,我将20200821等数据作为int。这基本上是yyyymmdd。只需尝试其中msdb.dbo.agent_datetimeCalendarDate,0 bwteen…..的规则显示,如果在表达式中组合int和datetime,则int将转换为datetime。坏消息是20200821并不是您想要的:选择将0转换为DateTime作为BaseDate,将1转换为DateTime作为OneDayLater;。您需要选择int部分并重新组装它,例如使用.Answer find,但不是SQLServerBuddy使用WHERE msdb.dbo.agent_datetimeCalendarDate,0 bwteen的方法。。。同样有效。通过修改列的值,您将失去对该列使用索引的能力。此外,它还意味着更多的计算—更多的CPU使用。
SELECT Id, CAST(CAST(CalendarDate as varchar(10)) as date)
FROM dbo.Sales
WHERE CalendarDate BETWEEN CAST(CONVERT(CHAR(8),dateadd(month,-6, GETDATE()),112)  AS INT) and CAST(CONVERT(CHAR(8),GETDATE(),112) AS INT)