Solved

Inverse of a SQL Function

Posted on 2016-08-12
6
54 Views
Last Modified: 2016-08-12
I'm trying to find a way to create a formula to produce the inverse of this function. When writing the answer can you also write down what happens at each step? I tried to break down the formula to see what happens when we do (@StartQtr/10*10) since it looks like a redundant statement but I couldnt see the answer.

GO

/****** Object:  UserDefinedFunction [dbo].[FutureQtr_fn]    Script Date: 08/12/2016 11:52:56 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- This function takes a qtr (yyyyq), and adds the number of qtrs, and returns the future qtr
--e.g. FutureQtr (20154,7) returns 20173
CREATE FUNCTION [dbo].[FutureQtr_fn] (@StartQtr int,@AddlQtrs int)

Returns int
AS BEGIN
RETURN
      (@StartQtr/10*10)+ -- Current Year (yyyy)
            ((@StartQtr%(@StartQtr/10*10) +@AddlQtrs - 1)/4)*10 -- add'l years (n0)
            +(@StartQtr%(@StartQtr/10*10) +@AddlQtrs-1)%4  + 1 -- new qtr (n)
END

GO

Open in new window


Thanks
0
Comment
Question by:endurance
  • 3
  • 3
6 Comments
 
LVL 69

Expert Comment

by:Scott Pletcher
ID: 41754377
What do you mean by "inverse"?  Subtract qtrs?
0
 

Author Comment

by:endurance
ID: 41754380
Yes
0
 
LVL 69

Assisted Solution

by:Scott Pletcher
Scott Pletcher earned 500 total points
ID: 41754384
Personally I'd adjust the code's method so that you can just pass in a negative number of qtrs when you want to back up:

SELECT dbo.FutureQtr_fn(20154,7), dbo.FutureQtr_fn(20173,-7)

ALTER FUNCTION [dbo].[FutureQtr_fn]
(
    @StartQtr int,
    @AddlQtrs int
)
RETURNS int
AS
BEGIN
RETURN (
    SELECT (total_qtrs / 4 * 10) + (total_qtrs % 4 + 1)
    FROM (
        SELECT ((@StartQtr/10*4)+(@StartQtr%10)+(@AddlQtrs-1)) AS total_qtrs
    ) AS calc_new_qtr
)
END /*FUNCTION*/
0
Optimizing Cloud Backup for Low Bandwidth

With cloud storage prices going down a growing number of SMBs start to use it for backup storage. Unfortunately, business data volume rarely fits the average Internet speed. This article provides an overview of main Internet speed challenges and reveals backup best practices.

 

Author Comment

by:endurance
ID: 41754442
that doesn't really work the way I need. I'll be creating a new function call it dbo.PastQtr_fn and when I write select dbo.PastQtr_fn(20154,7) I should get 20141.
0
 
LVL 69

Accepted Solution

by:
Scott Pletcher earned 500 total points
ID: 41754468
CREATE FUNCTION [dbo].[PastQtr_fn]
(
    @StartQtr int,
    @PastQtrs int
)
RETURNS int
AS
BEGIN
RETURN (
    SELECT (total_qtrs / 4 * 10) + (total_qtrs % 4 + 1)
    FROM (
        SELECT ((@StartQtr/10*4)+(@StartQtr%10)-(@PastQtrs+1)) AS total_qtrs
    ) AS calc_new_qtr
)
END /*FUNCTION*/
0
 

Author Closing Comment

by:endurance
ID: 41754476
Thank you so much.
0

Featured Post

VMware Disaster Recovery and Data Protection

In this expert guide, you’ll learn about the components of a Modern Data Center. You will use cases for the value-added capabilities of Veeam®, including combining backup and replication for VMware disaster recovery and using replication for data center migration.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Why is this different from all of the other step by step guides?  Because I make a living as a DBA and not as a writer and I lived through this experience. Defining the name: When I talk to people they say different names on this subject stuff l…
In this article I will describe the Detach & Attach method as one possible migration process and I will add the extra tasks needed for an upgrade when and where is applied so it will cover all.
Via a live example, show how to set up a backup for SQL Server using a Maintenance Plan and how to schedule the job into SQL Server Agent.
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.

805 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question