Oracle SQL 字符串比较

Oracle SQL String Compare

我在 table 中有以下条目:

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.

我想计算 'Mondays'、'Tuesdays' 等日期... 但是,我得到以下信息:

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

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

尝试:

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

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

请参阅Number Format Models

The character elements MONTH, MON, DAY, and DY are padded with trailing blanks to the width of the longest full month name, the longest abbreviated month name, the longest full date name, or the longest abbreviated day name, respectively, among valid names determined by the values of NLS_DATE_LANGUAGE and NLS_CALENDAR parameters.

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

TO_CHAR(startdate, 'fmDAY'))

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

TO_CHAR(startdate,'D') = 2

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

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

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')