我已经创建了一个视图,用于显示从我们的销售点系统中提取的最近一小时内售出的商品。在SQL脚本中引用该视图以使用DBMAIL,将项目列表发送到需要重新进货的商店。 POS系统使用单独的TKT_DT和TKT_TIM列,尽管两者都被格式化为DATETIM。据我所知,由于DATE列始终使用00:00:00,而TIME列始终使用12/30/1899,因此我可以简单地添加两列中的值以达到DATETIME - 但是,WHERE过滤器在我的查询中表现不尽如人意。
SELECT dbo.VI_PS_DOC_LIN.STR_ID
, dbo.VI_PS_DOC_LIN.ITEM_NO
, dbo.VI_PS_DOC_LIN.DESCR
, dbo.VI_PS_DOC_LIN.DIM_1_UPR
, dbo.VI_PS_DOC_LIN.DIM_2_UPR
, dbo.VI_PS_DOC_LIN.QTY_SOLD
, dbo.VI_PS_DOC_HDR.TKT_DAT + dbo.VI_PS_DOC_HDR.TKT_TIM AS TICKETTIME
, dbo.VI_PS_DOC_HDR.TKT_DAT
, dbo.VI_PS_DOC_HDR.TKT_TIM
FROM dbo.VI_PS_DOC_HDR
FULL OUTER JOIN dbo.VI_PS_DOC_LIN ON dbo.VI_PS_DOC_HDR.DOC_ID = dbo.VI_PS_DOC_LIN.DOC_ID
WHERE (dbo.VI_PS_DOC_HDR.STR_ID <> '3')
AND (dbo.VI_PS_DOC_HDR.TKT_DAT + dbo.VI_PS_DOC_HDR.TKT_TIM < DATEADD(minute, - 60, CURRENT_TIMESTAMP))
AND (dbo.VI_PS_DOC_HDR.STR_ID <> '99')
返回的数据为here
有人可以建议将结果限制在过去一小时内发生的故障单吗?
请注意,SSMS不会引发语法错误,只是过滤器没有过滤数据中的任何行(STR_ID 3和STR_ID 99除外)
答案 0 :(得分:0)
不是您问题的答案,但您确实应该学会在查询中使用别名。发布后,您的查询非常具有挑战性。简单地对表格进行混淆可以使眼睛看起来更容易,也更容易支持。
SELECT l.STR_ID
, l.ITEM_NO
, l.DESCR
, l.DIM_1_UPR
, l.DIM_2_UPR
, l.QTY_SOLD
, h.TKT_DAT + h.TKT_TIM AS TICKETTIME
, h.TKT_DAT
, h.TKT_TIM
FROM dbo.VI_PS_DOC_HDR
FULL OUTER JOIN dbo.VI_PS_DOC_LIN ON h.DOC_ID = l.DOC_ID
WHERE (h.STR_ID <> '3')
AND (h.TKT_DAT + h.TKT_TIM < DATEADD(minute, - 60, CURRENT_TIMESTAMP))
AND (h.STR_ID <> '99')
答案 1 :(得分:0)
试试这个......
SELECT dbo.VI_PS_DOC_LIN.STR_ID
, dbo.VI_PS_DOC_LIN.ITEM_NO
, dbo.VI_PS_DOC_LIN.DESCR
, dbo.VI_PS_DOC_LIN.DIM_1_UPR
, dbo.VI_PS_DOC_LIN.DIM_2_UPR
, dbo.VI_PS_DOC_LIN.QTY_SOLD
, dbo.VI_PS_DOC_HDR.TKT_DAT + dbo.VI_PS_DOC_HDR.TKT_TIM AS TICKETTIME
, dbo.VI_PS_DOC_HDR.TKT_DAT
, dbo.VI_PS_DOC_HDR.TKT_TIM
FROM dbo.VI_PS_DOC_HDR
FULL OUTER JOIN dbo.VI_PS_DOC_LIN ON dbo.VI_PS_DOC_HDR.DOC_ID = dbo.VI_PS_DOC_LIN.DOC_ID
WHERE (dbo.VI_PS_DOC_HDR.STR_ID <> '3') AND (dbo.VI_PS_DOC_HDR.TKT_DAT = CAST(GETDATE() AS DATE)) AND dbo.VI_PS_DOC_HDR.TKT_TIM <CONVERT(varchar(10), DATEADD(m, - 60, GETDATE()), 108))) AND (dbo.VI_PS_DOC_HDR.STR_ID <> '99')