创建一个按从另一个 table 导入的时间排序的过程?
Create a procedure sorting by time imported from another table?
我正在尝试使用两个日期时间值对我的查询进行排序,但无法正常工作。
它只是抱怨日期时间格式。
当我尝试执行以下命令时收到此错误消息
exec GetSingleAvailability @MachineID = 1002
Conversion failed when converting date and/or time from character
string.
这是我的程序:
ALTER PROCEDURE [dbo].[GetSingleAvailability]
-- Add the parameters for the stored procedure here
@MachineID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @Availabilitytime datetime
DECLARE @TimeNow datetime
set @Availabilitytime = (SELECT Availabilitytime FROM dbo.machines Where MachineID = @MachineID)
set @TimeNow = (SELECT GETDATE() AS time)
DECLARE @query nvarchar(150)
set @query = 'SELECT AVG(effectively) FROM ['+ Convert(nvarchar, @MachineID) +'] WHERE time between '+ @Availabilitytime +' and '+ @TimeNow +''
EXECUTE sp_executesql @query
END
您的程序可能需要稍微修改一下:
ALTER Proc GetSingleAvailability (@MachineID int) as
begin
set nocount on
declare @Availabilitytime datetime, @TimeNow datetime, @query nvarchar(150)
select
@Availabilitytime =
(select AvailabilityTime from machines where MachineID = @MachineID)
, @TimeNow = getDate()
, @query = N'select avg(effectively) from '
+ quoteName(convert(nvarchar, @MachineID))
+ N' where [time] between '
+ quoteName(convert(nvarchar, @Availabilitytime, 120), nchar(39))
+ N' and '
+ quoteName(convert(nvarchar, @TimeNow, 120), nchar(39))
execute sp_executesql @query
end
如果您只需要时间 (hh:mm:ss
) 部分,请将 120
更改为 8
。
找到了这样的解决方案:
USE [MITestdb]
GO
/****** Object: StoredProcedure [dbo].[GetSingleAvailability] Script Date: 2020-09-11 20:10:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GetSingleAvailability]
-- Add the parameters for the stored procedure here
@MachineID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @Availabilitytime datetime
DECLARE @TimeNow datetime
set @Availabilitytime = (SELECT Availabilitytime FROM dbo.machines Where MachineID = @MachineID)
set @TimeNow = (SELECT GETDATE())
DECLARE @query nvarchar(150)
set @query = 'SELECT AVG(effectively) FROM ['+ Convert(nvarchar, @MachineID) +'] WHERE time between @qAvailabilitytime and @qTimeNow'
EXECUTE sp_executesql @query,
N'@qAvailabilitytime datetime, @qTimeNow datetime',
@qAvailabilitytime = @Availabilitytime, @qTimeNow = @TimeNow
END
我正在尝试使用两个日期时间值对我的查询进行排序,但无法正常工作。 它只是抱怨日期时间格式。
当我尝试执行以下命令时收到此错误消息
exec GetSingleAvailability @MachineID = 1002
Conversion failed when converting date and/or time from character string.
这是我的程序:
ALTER PROCEDURE [dbo].[GetSingleAvailability]
-- Add the parameters for the stored procedure here
@MachineID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @Availabilitytime datetime
DECLARE @TimeNow datetime
set @Availabilitytime = (SELECT Availabilitytime FROM dbo.machines Where MachineID = @MachineID)
set @TimeNow = (SELECT GETDATE() AS time)
DECLARE @query nvarchar(150)
set @query = 'SELECT AVG(effectively) FROM ['+ Convert(nvarchar, @MachineID) +'] WHERE time between '+ @Availabilitytime +' and '+ @TimeNow +''
EXECUTE sp_executesql @query
END
您的程序可能需要稍微修改一下:
ALTER Proc GetSingleAvailability (@MachineID int) as
begin
set nocount on
declare @Availabilitytime datetime, @TimeNow datetime, @query nvarchar(150)
select
@Availabilitytime =
(select AvailabilityTime from machines where MachineID = @MachineID)
, @TimeNow = getDate()
, @query = N'select avg(effectively) from '
+ quoteName(convert(nvarchar, @MachineID))
+ N' where [time] between '
+ quoteName(convert(nvarchar, @Availabilitytime, 120), nchar(39))
+ N' and '
+ quoteName(convert(nvarchar, @TimeNow, 120), nchar(39))
execute sp_executesql @query
end
如果您只需要时间 (hh:mm:ss
) 部分,请将 120
更改为 8
。
找到了这样的解决方案:
USE [MITestdb]
GO
/****** Object: StoredProcedure [dbo].[GetSingleAvailability] Script Date: 2020-09-11 20:10:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[GetSingleAvailability]
-- Add the parameters for the stored procedure here
@MachineID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE @Availabilitytime datetime
DECLARE @TimeNow datetime
set @Availabilitytime = (SELECT Availabilitytime FROM dbo.machines Where MachineID = @MachineID)
set @TimeNow = (SELECT GETDATE())
DECLARE @query nvarchar(150)
set @query = 'SELECT AVG(effectively) FROM ['+ Convert(nvarchar, @MachineID) +'] WHERE time between @qAvailabilitytime and @qTimeNow'
EXECUTE sp_executesql @query,
N'@qAvailabilitytime datetime, @qTimeNow datetime',
@qAvailabilitytime = @Availabilitytime, @qTimeNow = @TimeNow
END