【问题标题】:How is casting the column name in a SQL query different from casting the value在 SQL 查询中转换列名与转换值有何不同
【发布时间】:2020-09-29 04:16:15
【问题描述】:

比如说

cast(PURCHASE_DATE as date) > '2020-01-01'

对比

PURCHASE_DATE > cast('2020-01-01' as date format)

我对上述问题有几个问题:

  1. 我在我的应用程序上测试了这些,它们都导致相同的结果。是否存在失败的情况?
  2. 这两种表达方式在资源使用方面有何不同?
  3. 强制转换列是否会转换它要比较的每个值,而不是将不等式的右侧转换一次以与该列中的所有值进行比较?

【问题讨论】:

  • PURCHASE_DATE 的数据类型是什么?第二个代码中没有 CAST
  • 嘿,抱歉,感谢您的关注,我已更新。这也是一个演员表。 PURCHASE_DATE 也是日期格式,但假设它不是“YYYY-MM-DD”,这就是我需要转换的原因。
  • FORMAT 短语仅在与字符串相互转换时适用。如果 PURCHASE_DATE 是 DATE 数据类型,则不需要 CAST。最好使用 ANSI 日期文字,例如 date'2020-01-01'(始终为 yyyy-mm-dd)进行此类比较。如果必须以字符串形式提供日期,则应使用 CAST 或 TO_DATE(使用适当的 FORMAT)转换为内部 DATE 类型。

标签: mysql sql teradata


【解决方案1】:

如果您使用 PURCHASE_DATE 作为 DATETIME 类型的列,则可以使用 CAST(colum AS DATE) 以便更好地使用该列的类型,并且可能在可伸缩性方面。另一种方法是您只是硬编码日期变量,而不使用数据类型的好处,例如更改时区(如果您曾经使用过)。参考:11.2.2 The DATE, DATETIME, and TIMESTAMP Types

【讨论】:

    【解决方案2】:

    顺便说一句,你不需要投日期是你这样使用它:

    WHERE PURCHASE_DATE > '2020-01-01'
    

    或者这个,对于数字:

    WHERE PURCHASE_ID > '0001000'
    

    Teradata 允许大量隐式转换。

    【讨论】:

    • 第一次可能会失败。它是一个字符串,将使用目标列的格式转换为日期。如果格式发生变化,演员阵容将会下降。编写日期的唯一安全方法是标准 SQL 日期文字DATE '2020-01-01'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2014-09-18
    • 2012-09-06
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多