You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL查询1997年6月前两日供货的供应商名称

问题:获取指定日期范围内有供货记录的供应商名称

关联表结构

  • suppliers表列:SUPPLIERID, COMPANYNAME, CONTACTNAME, CONTACTTITLE, ADDRESS, CITY, REGION, POSTALCODE, COUNTRY, PHONE, FAX, HOMEPAGE
  • products表列:PRODUCTID, PRODUCTNAME, SUPPLIERID, CATEGORYID, QUANTITYPERUNIT, UNITPRICE, UNITSINSTOCK, UNITSONORDER, REORDERLEVEL, DISCONTINUED
  • orderdetails表列:ORDERID, PRODUCTID, UNITPRICE, QUANTITY, DISCOUNT
  • orders表列:ORDERID, CUSTOMERID, EMPLOYEEID, TERRITORYID, ORDERDATE, REQUIREDDATE, SHIPPEDDATE, SHIPVIA, FREIGHT, SHIPNAME, SHIPADDRESS, SHIPCITY, SHIPREGION, SHIPPOSTALCODE, SHIPCOUNTRY

需求

获取1997年6月1日至2日期间有供货记录的供应商名称。

尝试的SQL(无法正常运行)

SELECT DISTINCT companyname FROM suppliers 
JOIN products ON suppliers.supplierid=products.supplierid
JOIN orderdetails ON products.productid=orderdetails.productid
JOIN orders ON orderdetails.orderid=orders.orderid

where  orderdate between TO_DATE('01/06/97', 'DD/MM/YY')
                    AND TO_DATE('02/06/97', 'DD/MM/YY');

修正方案

你的SQL逻辑框架是正确的,无法运行大概率是日期函数的数据库兼容性问题,不同数据库对日期转换的语法要求不同,以下是针对主流数据库的修正版本:

1. Oracle数据库(匹配你用的TO_DATE函数)

如果是Oracle,检查是否是日期格式或语法细节问题,修正后的语句如下:

SELECT DISTINCT s.COMPANYNAME
FROM suppliers s
JOIN products p ON s.SUPPLIERID = p.SUPPLIERID
JOIN orderdetails od ON p.PRODUCTID = od.PRODUCTID
JOIN orders o ON od.ORDERID = o.ORDERID
WHERE o.ORDERDATE BETWEEN TO_DATE('01/06/1997', 'DD/MM/YYYY')
                      AND TO_DATE('02/06/1997 23:59:59', 'DD/MM/YYYY HH24:MI:SS');
  • 补充完整年份1997避免歧义
  • 若ORDERDATE包含时分秒,需在结束日期加上23:59:59,否则会漏掉6月2日当天带时间的订单

2. MySQL数据库

MySQL不支持TO_DATE,需改用STR_TO_DATE函数:

SELECT DISTINCT s.COMPANYNAME
FROM suppliers s
JOIN products p ON s.SUPPLIERID = p.SUPPLIERID
JOIN orderdetails od ON p.PRODUCTID = od.PRODUCTID
JOIN orders o ON od.ORDERID = o.ORDERID
WHERE o.ORDERDATE BETWEEN STR_TO_DATE('01/06/1997', '%d/%m/%Y')
                      AND STR_TO_DATE('02/06/1997 23:59:59', '%d/%m/%Y %H:%i:%s');

3. SQL Server数据库

SQL Server使用CONVERT函数处理日期转换:

SELECT DISTINCT s.COMPANYNAME
FROM suppliers s
JOIN products p ON s.SUPPLIERID = p.SUPPLIERID
JOIN orderdetails od ON p.PRODUCTID = od.PRODUCTID
JOIN orders o ON od.ORDERID = o.ORDERID
WHERE o.ORDERDATE BETWEEN CONVERT(DATETIME, '01/06/1997', 103)
                      AND CONVERT(DATETIME, '02/06/1997 23:59:59', 103);
  • 样式码103对应DD/MM/YYYY格式

内容的提问来源于stack exchange,提问作者Paula12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:40:29