#mysql #sql
#mysql #sql
Вопрос:
Я использую MySQL, и по стандарту их формат даты в базе данных равен 2019/03/31.
В моей программе .net, csharp, я считываю значения в переменную как 31/03/2019, поэтому str_date_format не будет работать, поскольку это принимает только — вместо / .
Строки НЕ МОГУТ быть жестко закодированы в предложении where, в котором они должны быть прочитаны как параметры.
Итак, прочитав руководство, я пришел к выводу, что мне нужно использовать date_format с разделителями в предложении where
SELECT
DATE_FORMAT(date_time,'%d-%m-%Y'),
AVG(Total),
SUM(Total_ly),
AVG((Total Total_ly)/2)
FROM transaction
WHERE
date_format(date_time >= @param1 , '%d-%m-%Y')
AND date_format(date_time <= @param2, '%d-%m-%Y')
GROUP BY date_time;
Но он возвращает null для каждого столбца, и это не имеет смысла, потому что без предложения where это работает нормально.
Я отредактировал более подробно, надеюсь, это поможет, ценю любые советы в правильном направлении!
Комментарии:
1. Немного запутанно говорить, что вам нужно использовать формат с косыми чертами, а затем использовать формат с тире…
Ответ №1:
Я предполагаю, что вы на самом деле имеете в виду:
SELECT
DATE_FORMAT(date_time,'%d-%m-%Y'),
AVG(Total),
SUM(Total_ly),
AVG((Total Total_ly)/2)
FROM transaction
WHERE
date_time >= STR_TO_DATE('22/03/2019' , '%d/%m/%Y')
AND date_time <= STR_TO_DATE('24/03/2019', '%d/%m/%Y')
GROUP BY date_time;
Подробные сведения:
-
DATE_FORMAT()
действительно, может использоваться для преобразования datetime в строку в ожидаемом формате -
STR_TO_DATE()
преобразует строку в дату с учетом спецификации формата; вы можете использовать это, чтобы преобразовать входные строки в даты, прежде чем сравнивать их со столбцомdate_time
. Или вы можете просто предоставить входные даты в правильном формате, которыйyyyy-mm-dd
Комментарии:
1. Теоретически это работает, но принимает значения для предложения where из переменных в csharp, и это не поддерживается — он использует / для разделения дд / мм / гггг, я думаю, я отредактирую вопрос для полного охвата
2. @juniordev101… хорошо, в принципе, вы хотите: STR_TO_DATE (’22-03-2019′, ‘% d /% m /% Y’)
3. Так что да, это правильно, я очень новичок во всем этом, так что извините за все вопросы, как мне передавать параметры вместо того, чтобы жестко указывать даты в предложении where, вы понимаете, что я имею в виду?
4. @juniordev101: вы можете легко найти ответ на этот вопрос в StackOverflow (или Google). В принципе, в Stack Overflow не рекомендуется существенно изменять вопрос после публикации ответов. Если мой ответ правильно ответил на ваш (оригинальный) вопрос, пожалуйста, поддержите его и примите… Если у вас есть дополнительные запросы, на которые вы не можете найти ответы самостоятельно, вы также можете задать другой вопрос. Приветствия!
Ответ №2:
Я думаю, вы подразумеваете, что where
предложение должно быть:
where date_time >= '2019-03-22' and
date_time <= '2019-03-24'
Не преобразовывайте даты в строки для сравнения.
Комментарии:
1. Они должны быть преобразованы, потому что моя программа передает значения в строку sql
2. @juniordev101 . . . Вы должны передавать значения в запрос, используя параметры , а не строки. И параметры могут быть введены, чтобы у вас могли быть даты.
Ответ №3:
Формат, который вы используете:
'%d-%m-%Y'
это не сопоставимый формат, подобный %Y-%m-%d
.
Но даже если бы это было так, это:
date_format(date_time >= "22-03-2019" , '%d-%m-%Y')
неверно, это должно быть записано как
date_format(date_time, '%d-%m-%Y') >= "22-03-2019" -- again not comparable.
Вы можете сделать то, что вам нужно, используя STR_TO_DATE()
для преобразования строки в дату:
SET @start = '22/03/2019';
SET @end = '24/03/2019';
select
date_format(date_time,'%d/%m/%Y'),
AVG(Total), sum(Total_ly),
AVG((Total Total_ly)/2)
from Transaction
WHERE date_time between STR_TO_DATE(@start, '%d/%m/%Y') AND STR_TO_DATE(@end, '%d/%m/%Y')
Group By date_time;
Комментарии:
1. Это работает идеально, я просматривал документацию mysql, и кажется, что STR_TO_DATE принимает только строку, но можно ли это передать как параметр?
2. Вы используете STR_TO_DATE, когда у вас есть строка для преобразования в дату, хотя mysql мог бы сделать и это:
WHERE date_time between '2019-03-22' AND '2019-03-24'
, но для наглядности я использую преобразование. Конечно, вы можете передать строку в качестве параметра.3. Сейчас я в некотором замешательстве, поэтому я хочу, чтобы класс where был отмечен как 31/03/2019, А НЕ 2019/03/31
4. Я отредактировал, теперь вы можете использовать 31/03/2019 в предложении where
5. ДА, теперь это работает, поэтому мой последний вопрос, который я исследовал, я все еще в замешательстве, скажем, у меня param1 = 22/03/2019, как мне поместить это в STR_TO_DATE, потому что это не сработает, если я просто заменю на жестко заданную дату