Как запросить столбец с неудобным форматом даты - PullRequest
0 голосов
/ 22 декабря 2010

Вот как форматируется дата:

 XXXXXX001221

Эта дата для 21 декабря

Если я хочу получить вчерашние записи с помощью функции CURDATE (), как бы я это сделал?

Ответы [ 2 ]

1 голос
/ 22 декабря 2010

Если вы просто делаете месяц-день (индексы основаны на строковом формате CURDATE (), который является ГГГГ-ММ-ДД):

SELECT * FROM table_name
WHERE date_field LIKE
  CONCAT('%', SUBSTR(DATE_SUB(CURDATE(), INTERVAL 1 DAY) FROM 6 FOR 2),
              SUBSTR(DATE_SUB(CURDATE(), INTERVAL 1 DAY) FROM 9 FOR 2));

Или альтернативным способом с использованием EXTRACT ():

SELECT * FROM table_name
WHERE date_field LIKE
  CONCAT('%', EXTRACT(MONTH FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)),
              EXTRACT(DAY FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)));




Для года:

SELECT * FROM table_name
WHERE date_field LIKE
  CONCAT('%', SUBSTR(DATE_SUB(CURDATE(), INTERVAL 1 DAY) FROM 3 FOR 2),
              SUBSTR(DATE_SUB(CURDATE(), INTERVAL 1 DAY) FROM 6 FOR 2),
              SUBSTR(DATE_SUB(CURDATE(), INTERVAL 1 DAY) FROM 9 FOR 2));


SELECT * FROM table_name
WHERE date_field LIKE
  CONCAT('%', EXTRACT(YEAR FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)),
              EXTRACT(MONTH FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)),
              EXTRACT(DAY FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)));




РЕДАКТИРОВАТЬ: вместо WHERE date_field LIKE ...вы можете использовать WHERE RIGHT(date_field, 6) = ..., как указано в ответе этого кода:

SELECT * FROM table_name
WHERE RIGHT(date_field, 4) =
  CONCAT(EXTRACT(MONTH FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)),
         EXTRACT(DAY FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)));

SELECT * FROM table_name
WHERE RIGHT(date_field, 6) =
  CONCAT(EXTRACT(YEAR FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)),
         EXTRACT(MONTH FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)),
         EXTRACT(DAY FROM DATE_SUB(CURDATE(), INTERVAL 1 DAY)));

ПРИМЕЧАНИЕ. Вы также можете использовать переменную для сохранения вычислений DATE_SUB (CURDATE (), INTERVAL 1 DAY) все время.

SET @yesterday = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
SELECT ...
0 голосов
/ 22 декабря 2010

Попробуйте что-то вроде:

SELECT * FROM table WHERE RIGHT(date_col, 6) = (SELECT CONVERT(VARCHAR(6), GETDATE()-1, 12) AS [YYMMDD])
...