Search code examples
sqlsql-serverdatetimeprocedure

Create a procedure sorting by time imported from another table?


I'm trying to use two datetime values to sort in my query but I cant get it work. It just complain on datetime formatting.

I got this error message when I try to execute following command

exec GetSingleAvailability @MachineID = 1002

Conversion failed when converting date and/or time from character string.

Heres my procedure:

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

Solution

  • Your procedure may need to be fixed a bit:

    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
    

    Change 120 to 8 if you only need the time (hh:mm:ss) part.