Sql 是否创建从另一个表导入的按时间排序的过程?

Sql 是否创建从另一个表导入的按时间排序的过程?,sql,sql-server,datetime,procedure,Sql,Sql Server,Datetime,Procedure,我试图在查询中使用两个datetime值进行排序,但无法正常工作。 它只是抱怨日期时间格式 我在尝试执行以下命令时收到此错误消息 exec GetSingleAvailability @MachineID = 1002 从字符转换日期和/或时间时转换失败 绳子 以下是我的程序: ALTER PROCEDURE [dbo].[GetSingleAvailability] -- Add the parameters for the stored procedure here @Machin

我试图在查询中使用两个datetime值进行排序,但无法正常工作。 它只是抱怨日期时间格式

我在尝试执行以下命令时收到此错误消息

exec GetSingleAvailability @MachineID = 1002
从字符转换日期和/或时间时转换失败 绳子

以下是我的程序:

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

检查使用参数而不是串联将值放入查询的可能性。您还应该查看并将其应用于要连接到查询中的表名,并且应该真正检查您的设计。每台机器一张桌子似乎不对。考虑在一个列中用机器的ID为所有机器使用一个表。Xabi,比你!这是一个比我的好得多的解决方案。