我对SQL很新。但是真的想尽可能多地学习。但是,我真的有一些工作需要做的事情(有点被抛入其中)。但我一直遇到路障。我需要创建一个始终具有我创建的存储过程的更新信息的表。我最初尝试加入表等,但是无法获得我需要的确切数据。到目前为止,我发现至少要收集正确数据的最佳方法是使用此存储过程。然而,这是另一个路障;把它放在一张桌子里。我需要一个表的原因是因为外部应用程序(正在为我们的位置开发的应用程序)需要使用此表来查看某些信息。由于数据可能会发生变化,因此每天会多次查看此表。我将非常感谢任何帮助或建议可能导致我得到我需要的解决方案。先感谢您。
这是我现在的存储过程。 (我很想能够用这个来创建一个视图但当然我不能因为变量声明而来)
DECLARE @now DATETIME
SET @now = CONVERT(VARCHAR(8),GETDATE(),108)
IF @now BETWEEN '06:40:00' AND '14:39:59'
SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber
WHERE Shift = 1 and PartNumber <>''
ELSE IF @now BETWEEN '14:40:00' AND '22:39:59'
SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber
WHERE Shift = 2 AND PartNumber <>''
ELSE IF @now BETWEEN '22:40:00' AND '24:59:59' OR @now BETWEEN '00:00:00' AND '06:39:59'
SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber
WHERE Shift = 3 AND PartNumber <>''
答案 0 :(得分:0)
您可以通过在“FROM”子句之前说“INTO whereever”来创建包含任何选择结果的表。但如果表存在,您将收到错误。因此,通常您会检查存储过程以查看表是否存在,如果存在则删除(删除),然后运行查询。然后,如果您希望所获得的数据或多或少“活跃”,则必须在查询之前安排存储过程运行
详细信息取决于您使用的产品,您编写的所有内容看起来像我与microsoft sql server关联的函数名称/约定,或者可能是mysql,但请说出您正在使用的内容。
另外:欢迎使用StackOverflow,您应该使用您正在使用的精确版本的sql来标记您的问题;读这个,很简短:https://stackoverflow.com/tags/sql/info。
答案 1 :(得分:0)
我认为你不需要参数。我没有写过这样的查询,但你可以说“DATEPART(hh,GETDATE())”和“DATEPART(mm,GETDATE())”分别得到小时和分钟。您可以在查询中包含测试时间。
您可以使用它来删除if语句和参数。现在你有:
WHERE Shift = 3 AND PartNumber <>''
从概念上讲,如果你可以说“WHERE shift = 现在的任何转移”,那就可以了。在SQL中,您使用CASE语句。有两种形式;你可以在google上看到这个,我将在下面显示“搜索”表单。
如果只是两个班次说,从午夜到下午2点,是1,其他时间是班次2,你想知道是否小时&lt; 14或不。你可以说:
WHERE shift = CASE WHEN DATEPART(hh, GETDATE()) < 14 THEN 1 ELSE 2 END AND partNubmer <> ''
这有意义吗?根据它的运行时间,你要么得到shift = 1 OR shift = 2.
SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber
WHERE PartNumber <>'' AND
CASE WHEN EXPRESSION_THAT_RETURNS_TRUE_DURING_SHIFT_1 THEN 1
EXPRESSION_THAT_RETURNS_TRUE_DURING_SHIFT_2 THEN 2
ELSE 3 END
在这里,它似乎是一种方便的方法,可以找出它是什么样的转变:“当前时间的小时部分是从现在开始的20分钟?”在sql server中,要获得该数字,请说:
SELECT DATEPART( hh, DATEADD(mi, 20, GETDATE()))
所以,你的表达可以是
WHERE PartNumber <>'' AND
CASE WHEN DATEPART( hh, DATEADD(mi, 20, GETDATE())) BETWEEN 7 AND 15 THEN 1
WHEN DATEPART( hh, DATEADD(mi, 20, GETDATE())) BETWEEN 16 AND 22 THEN 2 -- 4pm to 11:59:59...
ELSE 3 END
希望它有效。您可以尝试将datepart设为秒而不是几小时,ss是用于秒的符号。
答案 2 :(得分:0)
我看不出是否需要创建存储过程,除非有大量数据并且生成数据需要一段时间。
我建议稍微将存储过程更改为视图,然后视图将被视为表。
我没有测试过查询,所以如果有任何错误我道歉:
CREATE VIEW REQUIREDTABLENAME
AS
SELECT t.ProductionDate, t.Shift, t.LineNumber, t.Cart, t.CavityPosition, t.ProgramNumber, t.PartNumber,t.Cavity
FROM tblTransactionDetail t
JOIN tblLPCurrentOnline c
on t.Cart=c.Fixture
AND t.ProgramNumber=c.Program
AND t.LineNumber=c.Linenumber
WHERE Shift =
case
when CONVERT(VARCHAR(8),GETDATE(),108) BETWEEN '06:40:00' AND '14:39:59' then 1
when CONVERT(VARCHAR(8),GETDATE(),108) BETWEEN '14:40:00' AND '22:39:59' then 2
when CONVERT(VARCHAR(8),GETDATE(),108) BETWEEN '22:40:00' AND '24:59:59' OR CONVERT(VARCHAR(8),GETDATE(),108) BETWEEN '00:00:00' AND '06:39:59' then 3
end
and PartNumber <>''