【问题标题】:Oracle SQL String CompareOracle SQL 字符串比较
【发布时间】:2015-06-17 10:03:38
【问题描述】:

我在表中有以下条目:

SQL> select TO_CHAR(startdate, 'DAY') from ragreement;

TO_CHAR(STARTDATE,'DAY')
------------------------------------
WEDNESDAY
THURSDAY
SUNDAY
FRIDAY
MONDAY
SUNDAY
MONDAY
MONDAY
THURSDAY
SATURDAY
TUESDAY
SUNDAY
FRIDAY
WEDNESDAY
FRIDAY
SUNDAY
THURSDAY
MONDAY
THURSDAY
WEDNESDAY
TUESDAY
TUESDAY
MONDAY
SUNDAY
WEDNESDAY
FRIDAY
SUNDAY
MONDAY
WEDNESDAY

29 rows selected.

我想计算“星期一”、“星期二”等日期... 但是,我得到以下信息:

SQL> select count(*) from ragreement where UPPER(TO_CHAR(startdate, 'DAY')) = 'TUESDAY';

  COUNT(*)
----------
         0

SQL> select count(*) from ragreement where UPPER(TO_CHAR(startdate, 'DAY')) = 'MONDAY';

  COUNT(*)
----------
         0

谁能告诉我我做错了什么?

【问题讨论】:

    标签: sql oracle select count


    【解决方案1】:

    试试:

    SELECT COUNT(*)
      FROM ragreement
      WHERE TRIM(TO_CHAR(startdate, 'DAY')) = 'TUESDAY'
    

    我认为有空格填充空格。不需要UPPER,因为使用的格式化模型已经强制大写。

    请看Number Format Models

    字符元素 MONTH、MON、DAY 和 DY 填充有 拖尾空格到最长的完整月份名称的宽度, 最长的缩写月份名称、最长的完整日期名称或 最长的缩写日期名称,分别在有效名称中 由 NLS_DATE_LANGUAGE 和 NLS_CALENDAR 的值确定 参数。

    【讨论】:

    • 好答案,请添加您在其中找到信息的文档的链接。
    【解决方案2】:

    为了完整起见,这里有一个替代方案:

    SELECT t.day, COUNT(*)
    FROM (SELECT TRIM(TO_CHAR(startdate, 'DAY')) day FROM ragreement) t
    GROUP BY
        t.day
    

    当然,由于此解决方案不涉及字符串比较,因此可以(并且应该)简化:

    SELECT TO_CHAR(startdate, 'DAY'), COUNT(*)
    FROM ragreement
    GROUP BY
        TO_CHAR(startdate, 'DAY')
    

    【讨论】:

      【解决方案3】:

      Glenn 是对的 - 问题是默认情况下,Oracle 会使用最多 9 个字符的空格填充 DAY 格式掩码。只是为了添加格伦的建议(这很好),您也可以使用

      TO_CHAR(startdate, 'fmDAY'))

      删除尾随空格。或者你可以使用

      TO_CHAR(startdate,'D') = 2

      (我认为 2 是星期二,1=星期一,2=TUE,... 7=SUN),从本地化的角度来看,这更好。

      【讨论】:

        猜你喜欢
        • 2015-11-19
        • 2011-11-09
        • 1970-01-01
        • 2017-11-13
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 2020-12-06
        • 1970-01-01
        相关资源
        最近更新 更多