Преобразование дат в MySQL сбивает с толку

#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, потому что это не сработает, если я просто заменю на жестко заданную дату