在MySQL中转换日期令人困惑

时间:2019-03-31 12:23:02

标签: mysql sql

我使用的是MySql,按照标准,它们在数据库中的日期格式为2019/03/31。

在我的程序.net中,csharp我将值读入变量为31/03/2019,因此str_date_format将不起作用,因为它仅接受-而不是/。

不能在where子句中对字符串进行硬编码,而必须将其作为参数读取。

因此,通过阅读手册得出的结论是,我需要在where子句中使用带定界符的date_format

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子句就可以正常工作。

我更详细地进行了编辑,希望这对您有所帮助, 赞赏任何正确方向的建议!

3 个答案:

答案 0 :(得分:3)

我认为您打算将where子句设为:

where date_time >= '2019-03-22' and
      date_time <= '2019-03-24'

请勿将日期转换为字符串以进行比较。

答案 1 :(得分:3)

我猜你实际上是在说:

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()确实可以用于将日期时间转换为预期格式的字符串

  • STR_TO_DATE()将字符串转换为日期(给定格式规范);您可以使用它将输入的字符串转换为日期,然后将其与列date_time进行比较。或者,您可以简单地以正确的格式提供输入日期,即yyyy-mm-dd

答案 2 :(得分:1)

您使用的格式:

bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 443
Could not request local forwarding.

不是类似'%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()