【问题标题】:If/then/else in SQL QuerySQL 查询中的 if/then/else
【发布时间】:2013-05-22 03:20:51
【问题描述】:

我想检查我的 SQL 查询中的日期值。如果日期等于预定义日期,则不打印任何内容,否则打印现有日期值。

我怎样才能正确地编写它以获取所需的日期值?

我有以下疑问:

(SELECT (CASE 
             WHEN (PaymentsMade.PaymentDate = '09/09/1987') THEN ' '
             ELSE PaymentsMade.PaymentDate
         END)
 ) as dateOfPayment

当我运行此查询时,当日期等于 '09/09/1987' 时它可以正常工作,而当日期不等于 '09/09/1987' 时,它会打印 '01/01/1900'。

如何检索不等于预定义日期“09/09/1987”的日期值?

任何建议将不胜感激。 谢谢

【问题讨论】:

  • 字段PaymentDate是什么数据类型?

标签: sql tsql if-statement case


【解决方案1】:

CASE 子句需要返回一个一致类型的值,因此它隐式地将空格转换为日期(计算为 1900 年 1 月 1 日)。

你有两个选择:

  • 选择空值而不是空格。
  • else 条件中的日期显式转换为字符串。

这是前者的(隐式)示例:

SELECT (CASE WHEN PaymentsMade.PaymentDate <> '09/09/1987' 
             THEN PaymentsMade.PaymentDate
         END)
       as dateOfPayment

【讨论】:

  • 是的,非常感谢你,马克,你是绝对正确的:)
  • @user1552812 - 很有趣,因为您的问题表明您遇到了ELSE 而非THEN ' ' 的问题。这个答案解释了为什么THEN ' ' 会有问题......
【解决方案2】:

使用NULL,而不是空字符串

一个空字符串被隐式转换为零,即'01/01/1900'

SELECT CAST('' AS datetime)

【讨论】:

    【解决方案3】:

    使用CASE 语句会更改该字段中的值,但不会更改返回的

    似乎想要过滤掉,如果是这种情况,请使用WHERE 子句...

    SELECT
      *
    FROM
      PaymentsMade
    WHERE
      PaymentDate <> '09/09/1987'
    

    【讨论】:

      【解决方案4】:

      您可以使用NULLIF 将特定日期替换为 NULL:

      SELECT NULLIF(PaymentsMade.PaymentDate, '09/09/1987')
      FROM ...
      

      不要只使用空字符串,因为它会被转换为PaymentDate 的类型,这可能是datetime,而'' 的等效datetime 将是1900-01-01 00:00:00.000

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 2018-10-30
        • 2023-03-25
        • 1970-01-01
        • 2015-06-07
        相关资源
        最近更新 更多