【Sql】DATEDIFF()函数,两个参数和三个参数的区别

DATEDIFF函数在MySQL和SQLServer中的使用有所不同。在MySQL中,它直接计算两个日期间的天数差异;而在SQLServer中,需指定datepart参数,如day,来计算不同时间单位的差异。

MySQL中,DATEDIFF() 函数的语法如下:

DATEDIFF(end_date, start_date)

在这种语法中,end_date 是结束日期,start_date 是起始日期。函数将返回从 start_dateend_date 之间的天数差异。

 例如,在MySQL中计算从 2023 年 7 月 10 日到 2023 年 7 月 15 日之间的天数差异,可以使用以下查询:

SELECT DATEDIFF('2023-07-15', '2023-07-10') AS day_diff;

而在SQL Server中,DATEDIFF() 函数的语法略有不同:

DATEDIFF(datepart, start_date, end_date)
  • datepart是指定差异单位的参数,可以是以下值之一:
    • 'year''yy':计算年份之间的差值。
    • 'quarter''qq':计算季度之间的差值。
    • 'month''mm':计算月份之间的差值。
    • 'day''dd':计算天数之间的差值。
    • 'hour''hh':计算小时之间的差值。
    • 'minute''mi':计算分钟之间的差值。
    • 'second''ss':计算秒数之间的差值。
  • start_date 是起始日期。
  • end_date 是结束日期。

例如,在SQL Server中计算从 2023 年 7 月 10 日到 2023 年 7 月 15 日之间的天数差异,可以使用以下查询:

SELECT DATEDIFF(day, '2023-07-10', '2023-07-15') AS day_diff;

WITH -- 生成2022-2025年月度基础表 Months AS ( SELECT CONVERT(VARCHAR(7), DATEADD(MONTH, number, '2022-01-01'), 120) AS 年月 FROM master..spt_values WHERE type = 'P' AND number BETWEEN 0 AND DATEDIFF(MONTH, '2022-01-01', '2025-12-01') ), -- 报废不良数据 Scrap AS ( SELECT '报废不良' AS 类型, LEFT(REPLACE(日期, '/', '-'), 7) AS 年月, SUM(CONVERT(INT, 数量)) AS 数量 FROM [dbo].[V_报废不良] WHERE 生产线 = '缸体' AND 报废原因 = '加工不良' AND [工件号码] NOT IN ('8304-8308-8311') AND LEFT(REPLACE(日期, '/', '-'), 4) BETWEEN '2022' AND '2025' AND 产线 = 'TNGA12' GROUP BY LEFT(REPLACE(日期, '/', '-'), 7) ), -- 返修不良数据 Repair AS ( SELECT '返修不良' AS 类型, LEFT(REPLACE(日期, '/', '-'), 7) AS 年月, SUM(CONVERT(INT, 数量)) AS 数量 FROM [dbo].[V_返修不良] WHERE 科室 = '第3制造科' AND 生产线 = '缸体' AND 不良区分 NOT IN ('9') AND LEFT(REPLACE(日期, '/', '-'), 4) BETWEEN '2022' AND '2025' GROUP BY LEFT(REPLACE(日期, '/', '-'), 7) ), -- 合并不良数据 AllDefects AS ( SELECT m.年月, '报废不良' AS 类型, ISNULL(s.数量, 0) AS 数量 FROM Months m LEFT JOIN Scrap s ON m.年月 = s.年月 UNION ALL SELECT m.年月, '返修不良' AS 类型, ISNULL(r.数量, 0) AS 数量 FROM Months m LEFT JOIN Repair r ON m.年月 = r.年月 ), -- 实绩数据 Production AS ( SELECT LEFT(REPLACE(日期, '/', '-'), 7) AS 年月, SUM(实绩) AS 实绩 FROM 现场DB.dbo.V_加工线每月生产台数 WHERE 线别 = '缸体' AND LEFT(REPLACE(日期, '/', '-'), 4) BETWEEN '2022' AND '2025' GROUP BY LEFT(REPLACE(日期, '/', '-'), 7) ), -- 主结果集 MainData AS ( SELECT ad.类型, ad.年月, ad.数量, ISNULL(p.实绩, 0) AS 实绩, CASE WHEN ISNULL(p.实绩, 0) > 0 THEN ROUND((CAST(ad.数量 AS FLOAT) / CAST(p.实绩 AS FLOAT)) * 100, 4) ELSE 0 END AS 不良率, '0.01' AS 目标 FROM AllDefects ad LEFT JOIN Production p ON ad.年月 = p.年月 ), -- 计算2022-2024年度平均值 YearlyAvg AS ( SELECT 类型, '2022-2024平均' AS 年月, AVG(数量) AS 数量, AVG(实绩) AS 实绩, CASE WHEN AVG(实绩) > 0 THEN ROUND((SUM(数量) * 1.0 / SUM(实绩)) * 100, 4) ELSE 0 END AS 不良率, '0.01' AS 目标 FROM MainData WHERE 年月 BETWEEN '2022-01' AND '2024-12' GROUP BY 类型 ) -- 合并最终结果 SELECT * FROM MainData WHERE 年月 LIKE '2025-%' UNION ALL SELECT * FROM YearlyAvg ORDER BY 年月; 生成:2022年度2023年度2024年度3个平均年度数据
最新发布
07-19
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

去码头整点薯条​⁢⁢⁢⁡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值