我有一个如下所示的查询,我想计算end_scan-packing_date列,我如何实现这一点?
SELECT a.invoice_no,
CONVERT(VARCHAR, b.packing_date,3) as packing_date ,
CONVERT(VARCHAR, b.exw_date,3) as exw,
CONVERT(VARCHAR, b.bcd_end_date, 3) as end_date,
(SELECT TOP 1 insert_date FROM wms.bcd_shipment d,wms.shinvoicedetails WHERE d.invoice_no = a.invoice_no ORDER BY insert_date ASC) as start_date ,
(SELECT TOP 1 insert_date FROM wms.bcd_shipment d,wms.shinvoicedetails WHERE d.invoice_no = a.invoice_no ORDER BY insert_date DESC) as end_scan,
CONVERT(VARCHAR, send_date, 3) as swnd_date,customer_short_name,
Sum(picking_qty) as qty,total_carton
FROM wms.shinvoicedetails a,
wms.shinvoiceheder b,
wms.shinvoice_ctrl c
WHERE send_date BETWEEN '2014/8/26 00:00:01' AND '2014/9/25 23:59:59'
AND a.invoice_no = b.invoice_no
AND a.invoice_no = c.invoice_no
GROUP BY a.invoice_no,
b.packing_date,
b.exw_date,
b.bcd_end_date,
send_date,
customer_short_name,
total_carton
ORDER BY 1; 发布于 2014-09-27 05:24:28
请参阅DATEDIFF函数的文档(假设您使用Server作为关系数据库管理系统)。
它有3个参数,我假设您希望在几天内有差异。所以你想读的东西是这样的:
DATEDIFF(DAY,
(SELECT TOP 1 insert_date
FROM wms.bcd_shipment d,
wms.shinvoicedetails
WHERE d.invoice_no = a.invoice_no
ORDER BY insert_date DESC),
b.packing_date
) AS diff_days但是,您的查询在许多级别上都是错误的。您正在对几乎所有列进行分组以获得和,同时应该将其写入导出表 (子查询),只在必要的字段上分组。另外,您正在转换到VARCHAR,这可能转换为VARCHAR(1)。您可能应该将它写成转换(VARCHAR(10),,3)。
发布于 2014-09-27 07:51:06
一天不会从00:00:01开始,也不会以23:59:59结束。帮你自己一个忙,不要试图把你的需求转化为between的语法。有一种更简单、更可靠的方法
WHERE send_date >= '20140826' AND send_date < '20140926'不到26号;它更准确&没有愚蠢的一秒扣减。
使用日期和时间范围的最佳做法是避免并始终使用以下形式: 其中>= '20120101‘和col < '20120201’ 此表单适用于所有类型和所有精度,无论时间部分是否适用。 伊齐克本甘
http://sqlmag.com/t-sql/t-sql-best-practices-part-2
https://stackoverflow.com/questions/26070553
复制相似问题