DATE + TIME FIELDS合并到DATETIME未过滤MS SQL 2008

时间:2015-01-30 19:58:41

标签: sql-server datetime filter

我已经创建了一个视图,用于显示从我们的销售点系统中提取的最近一小时内售出的商品。在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除外)

2 个答案:

答案 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')