【问题标题】:Converting from MS-SQL Server query to MySQL and DATEDIFF()从 MS-SQL Server 查询转换为 MySQL 和 DATEDIFF()
【发布时间】:2014-01-10 03:46:05
【问题描述】:

我一直在将以下 MS-SQL Server 的查询转换为 MySQL,我被困在这个日期部分。谁能告诉我我在这里做错了什么?

原始 MS-SQL 查询(工作)

select  top 4
    [Mon]=sum(case when datename(weekday, vrdate) = 'Monday' then namount else 0 end),
    [Tue]=sum(case when datename(weekday, vrdate) = 'Tuesday' then namount else 0 end),
    [Wed]=sum(case when datename(weekday, vrdate) = 'Wednesday' then namount else 0 end),
    [Thu]=sum(case when datename(weekday, vrdate) = 'Thursday' then namount else 0 end),
    [Fri]=sum(case when datename(weekday, vrdate) = 'Friday' then namount else 0 end),
    [Sat]=sum(case when datename(weekday, vrdate) = 'Saturday' then namount else 0 end),
    [Sun]=sum(case when datename(weekday, vrdate) = 'Sunday' then namount else 0 end)
from    stockmain
where    etype = 'sale' and  DATEDIFF(MONTH, vrdate, getDate()) = 0
group by datepart(week, vrdate)
order by datepart(week, vrdate) ;

各个 MySQL 查询(不工作)

下面是相应的 MySQL 查询,我被困在 DATEDIFF 中的 WHERE 子句中。

select 
        sum(case when date_format(vrdate, '%W') = 'Monday' then namount else 0 end) as 'Mon',
        sum(case when date_format(vrdate, '%W') = 'Tuesday' then namount else 0 end) as 'Tue',
        sum(case when date_format(vrdate, '%W') = 'Wednesday' then namount else 0 end) as 'Wed',
        sum(case when date_format(vrdate, '%W') = 'Thursday' then namount else 0 end) as 'Thu',
        sum(case when date_format(vrdate, '%W') = 'Friday' then namount else 0 end) as 'Fri',
        sum(case when date_format(vrdate, '%W') = 'Saturday' then namount else 0 end) as 'Sat',
        sum(case when date_format(vrdate, '%W') = 'Sunday' then namount else 0 end) as 'Sun'
from    stockmain
where    etype = 'sale' and DATEDIFF(MONTH, vrdate, CURDATE()) = 0
group by WEEK(VRDATE)
order by WEEK(VRDATE) desc
LIMIT 4

【问题讨论】:

    标签: mysql sql sql-server dml


    【解决方案1】:

    datediff 在 SQL Server 上的工作方式与 MySQL 等效的是 timestampdiff

    WHERE TIMESTAMPDIFF(month, vrdate, curdate()) = 0
    

    以下可能是等价的,具体取决于datediff 在计算前一个月如何舍入:

    WHERE MONTH(vrdate) = MONTH(CURDATE())
    

    【讨论】:

    • 我只是在思考它是否实际上是等价的——我认为不是,但我现在手头没有要测试的软件。 timestampdiff 应该可以正常工作。
    • 两者产生了相同的结果。我会选择第二个。
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多