【问题标题】:Why doesn't my WHERE clause recognize field as date, even after having converted this field from int to date?为什么我的 WHERE 子句不能将字段识别为日期,即使在将此字段从 int 转换为 date 之后?
【发布时间】:2023-03-11 12:29:01
【问题描述】:

我在 SQL Server 中做了以下 SELECT 语句,这给了我错误:

将表达式转换为数据类型日期时间时出现算术溢出错误。

SELECT Id, CAST(CAST(CalendarDate as varchar(10)) as date)
FROM dbo.Sales
WHERE CalendarDate BETWEEN dateadd(month,-6, GETDATE()) AND (GETDATE())

Id = 唯一标识符

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

我做错了什么?

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

感谢任何帮助。

谢谢。

【问题讨论】:

  • intdate/datetime 是两种截然不同的类型。您希望它进行什么转换?
  • 是的。您尝试比较的两种数据类型都不同且不兼容。 CalendarDate 列中有哪些数据?
  • 我希望从 int 到日期,正如我所写的那样。我还尝试将其转换为日期时间。还是不行。在 CalendarDate 列中,我有诸如“20200821”之类的数据作为 int。这基本上是 yyyymmdd。
  • 试试 WHERE msdb.dbo.agent_datetime(CalendarDate,0) BWTEEEN .....
  • data type precedence 的规则表明,如果在表达式中组合 intdatetime,则 int 将转换为 datetime。坏消息是20200821 并不意味着你想要它:select Cast( 0 as DateTime ) as BaseDate, Cast( 1 as DateTime ) as OneDayLater;。您需要选择您的 int 部件并重新组装它,例如DateFromParts.

标签: sql-server tsql casting where-clause


【解决方案1】:

尝试像这样在 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)

【讨论】:

  • 已找到答案,但不是 SQLServerBuddy 使用“WHERE msdb.dbo.agent_datetime(CalendarDate,0) BWTEEEN ...”的方法也有效。
  • 通过修改列的值,您将失去在该列上使用索引的能力。此外,这意味着更多的计算 - 更多的 CPU 使用率。
【解决方案2】:

因为 Where 子句在 select 子句之前被评估,因此,转换后的字段不被识别,因为它还不存在。

基于https://docs.microsoft.com/en-us/sql/t-sql/queries/select-transact-sql?view=sql-server-ver15#logical-processing-order-of-the-select-statement,查询的评估顺序如下:

SELECT 语句的逻辑处理顺序 以下步骤显示了 选择语句。这个顺序决定了什么时候定义的对象 一个步骤可用于后续步骤中的子句。为了 例如,如果查询处理器可以绑定到(访问)表或 FROM 子句中定义的视图,这些对象及其列是 可用于所有后续步骤。相反,因为 SELECT 子句是第 8 步,定义的任何列别名或派生列 该条款不能被前面的条款引用。然而,他们 可以被后续子句引用,例如 ORDER BY 子句。 语句的实际物理执行由 查询处理器,顺序可能与此列表不同。

  1. 来自
  2. 开启
  3. 加入
  4. 在哪里
  5. 分组依据
  6. 使用多维数据集或使用汇总
  7. 选择
  8. 不同
  9. 订购人
  10. 顶部

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2018-07-08
    相关资源
    最近更新 更多