Как изменить / преобразовать формат даты и времени в часовой пояс только в формате MySQL - PullRequest
0 голосов
/ 16 января 2020

В одной из моих таблиц есть столбец для даты, и он сохраняет значение VARCHAR из-за формата часового пояса 2019-12-30 00:00:01 +0800. Есть ли способ изменить / преобразовать его только в формат date и создать запрос для диапазона дат? У меня трудности с конвертацией только на сегодняшний день. Я пытался изменить дату в php, но мне интересно, как преобразовать ее в SQL, потому что мне нужно запросить диапазон дат. Заранее благодарю за помощь.

У меня ошибка Incorrect datetime value: '2020-01-14 00:00:01 +0800' for function str_to_date

Я попробовал

(STR_TO_DATE(placed_date, "%Y/%m/%d") between DATE_ADD(DATE_ADD(LAST_DAY("2020-01-14"), INTERVAL 1 DAY), INTERVAL - 1 MONTH) AND LAST_DAY("2020-01-14") )

Ответы [ 3 ]

1 голос
/ 16 января 2020

Вы можете попробовать

SELECT STR_TO_DATE(placed_date, "%Y-%m-%d %H:%i:%s +%x%x%x%x")   FROM table1
WHERE STR_TO_DATE(placed_date, "%Y-%m-%d %H:%i:%s +%x%x%x%x")  between DATE_ADD(
         DATE_ADD(LAST_DAY("2020-01-14"), INTERVAL 1 DAY), INTERVAL - 1 MONTH) 
    AND LAST_DAY("2020-01-14") ; 

См. Экзамен

select version();
| version() |
| :-------- |
| 8.0.19    |
CREATE TABLE table1
    (`placed_date` varchar(30))
;

INSERT INTO table1
    (`placed_date`)
VALUES
    ("2019-12-30 00:00:01 +0800"),
    ("2019-12-29 00:00:01 +0800"),
    ("2019-12-28 00:00:01 +0800"),
    ("2019-12-27 00:00:01 +0800"),
        ("2020-01-02 00:00:01 +0800")
✓

✓
SELECT STR_TO_DATE(placed_date, "%Y-%m-%d %H:%i:%s +%x%x%x%x")    FROM table1
WHERE STR_TO_DATE(placed_date, "%Y-%m-%d %H:%i:%s +%x%x%x%x")  between DATE_ADD(
         DATE_ADD(LAST_DAY("2020-01-14"), INTERVAL 1 DAY), INTERVAL - 1 MONTH) 
    AND LAST_DAY("2020-01-14") ; 
| STR_TO_DATE(placed_date, "%Y-%m-%d %H:%i:%s +%x%x%x%x") |
| :------------------------------------------------------ |
| 2020-01-02 00:00:01                                     |
UPDATE  table1 SET placed_date =  DATE_FORMAT(STR_TO_DATE(placed_date, "%Y-%m-%d %H:%i:%s +%x%x%x%x"), "%Y-%m-%d");
ALTER TABLE table1 MODIFY placed_date DATE;
SELECT * FROM table1;
| placed_date |
| :---------- |
| 2019-12-30  |
| 2019-12-29  |
| 2019-12-28  |
| 2019-12-27  |
| 2020-01-02  |

дБ < > скрипка здесь

0 голосов
/ 16 января 2020

Как насчет этого:

SELECT  placed_date,SUBSTRING_INDEX(placed_date,' ',1) FROM test1
WHERE   SUBSTRING_INDEX(placed_date,' ',1) 
BETWEEN (LAST_DAY('2020-01-14') + INTERVAL 1 DAY - INTERVAL 1 MONTH) 
    AND LAST_DAY('2020-01-14');

Используйте только SUBSTRING_INDEX, и вы можете использовать функцию INTERVAL напрямую с оператором плюс минус (+ -) без DATE_ADD.

Скрипка здесь: https://www.db-fiddle.com/f/3qXHtWT1amyCLvasW7SpfH/2

0 голосов
/ 16 января 2020

Я не могу воспроизвести вашу ошибку, но есть две возможности:

  1. Это может быть потому, что секунды и часовой пояс +0800 не могут быть поняты как компонент даты в mysql.

Вы можете попытаться использовать только часть даты исходной строки для преобразования в дату, используя SUBSTRING:

(STR_TO_DATE(SUBSTRING(placed_date,1,10), "%Y/%m/%d")
    between DATE_ADD(
         DATE_ADD(LAST_DAY("2020-01-14"), INTERVAL 1 DAY), INTERVAL - 1 MONTH) 
    AND LAST_DAY("2020-01-14") )
Поскольку требуемый формат даты - %Y-%m-%d, попробуйте использовать его вместо %Y/%m/%d.
(STR_TO_DATE(placed_date, "%Y-%m-%d") 
    between DATE_ADD(
         DATE_ADD(LAST_DAY("2020-01-14"), INTERVAL 1 DAY), INTERVAL - 1 MONTH) 
    AND LAST_DAY("2020-01-14") )

Я лично считаю, что причина 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...