What is the best way to rebuild a date from integer inputs?












2














I've got a bunch of financial reports, and we want to be able to pass them two inputs (year and quarter) as variables.



I'm doing it this way, but I really don't like it:



    declare @quarter int,
@year int,
@date date

set @quarter = 4
set @year = 2018


set @date = cast(@year as varchar(4)) + '-01-01'
set @date = dateadd(quarter, @quarter - 1, @date)


print @date


Question What is the best way to reconstruct a date from integer inputs?



desired result:



    2018-10-01









share|improve this question





























    2














    I've got a bunch of financial reports, and we want to be able to pass them two inputs (year and quarter) as variables.



    I'm doing it this way, but I really don't like it:



        declare @quarter int,
    @year int,
    @date date

    set @quarter = 4
    set @year = 2018


    set @date = cast(@year as varchar(4)) + '-01-01'
    set @date = dateadd(quarter, @quarter - 1, @date)


    print @date


    Question What is the best way to reconstruct a date from integer inputs?



    desired result:



        2018-10-01









    share|improve this question



























      2












      2








      2







      I've got a bunch of financial reports, and we want to be able to pass them two inputs (year and quarter) as variables.



      I'm doing it this way, but I really don't like it:



          declare @quarter int,
      @year int,
      @date date

      set @quarter = 4
      set @year = 2018


      set @date = cast(@year as varchar(4)) + '-01-01'
      set @date = dateadd(quarter, @quarter - 1, @date)


      print @date


      Question What is the best way to reconstruct a date from integer inputs?



      desired result:



          2018-10-01









      share|improve this question















      I've got a bunch of financial reports, and we want to be able to pass them two inputs (year and quarter) as variables.



      I'm doing it this way, but I really don't like it:



          declare @quarter int,
      @year int,
      @date date

      set @quarter = 4
      set @year = 2018


      set @date = cast(@year as varchar(4)) + '-01-01'
      set @date = dateadd(quarter, @quarter - 1, @date)


      print @date


      Question What is the best way to reconstruct a date from integer inputs?



      desired result:



          2018-10-01






      sql-server-2008-r2






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 2 hours ago







      James

















      asked 3 hours ago









      JamesJames

      989726




      989726






















          3 Answers
          3






          active

          oldest

          votes


















          5














          Let me suggest to NOT use a date separator like '-' or '/', it deppends on regional settings, use YYYYMMDD format.



          declare @quarter int,
          @year int,
          @date date

          set @quarter = 4
          set @year = 2018


          set @date = cast(@year as varchar(4)) + '0101'
          set @date = dateadd(quarter, 1 - 1, @date)
          print @date

          set @date = cast(@year as varchar(4)) + '0101'
          set @date = dateadd(quarter, 2 - 1, @date)
          print @date

          set @date = cast(@year as varchar(4)) + '0101'
          set @date = dateadd(quarter, 3 - 1, @date)
          print @date

          set @date = cast(@year as varchar(4)) + '0101'
          set @date = dateadd(quarter, 4 - 1, @date)
          print @date




          2018-01-01
          2018-04-01
          2018-07-01
          2018-10-01


          db<>fiddle here






          share|improve this answer





























            3














            How about



            declare @quarter int = 4
            declare @year int = 2018

            select datefromparts(@year,(@quarter-1)*3+1,1)


            or if you're still using SQL 2008:



            select dateadd(month,(@quarter-1)*3,dateadd(year, @year-2018,'20180101'))





            share|improve this answer





























              2














              You could Create a date dimension or calendar table in SQL Server and query it



              --demo setup 
              drop table if exists #dim
              DECLARE @StartDate DATE = '20000101', @NumberOfYears INT = 30;

              -- prevent set or regional settings from interfering with
              -- interpretation of dates / literals

              SET DATEFIRST 7;
              SET DATEFORMAT mdy;
              SET LANGUAGE US_ENGLISH;

              DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

              -- this is just a holding table for intermediate calculations:

              CREATE TABLE #dim
              (
              [date] DATE PRIMARY KEY,
              [day] AS DATEPART(DAY, [date]),
              [month] AS DATEPART(MONTH, [date]),
              FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
              [MonthName] AS DATENAME(MONTH, [date]),
              [week] AS DATEPART(WEEK, [date]),
              [ISOweek] AS DATEPART(ISO_WEEK, [date]),
              [DayOfWeek] AS DATEPART(WEEKDAY, [date]),
              [quarter] AS DATEPART(QUARTER, [date]),
              [year] AS DATEPART(YEAR, [date]),
              FirstOfYear AS CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, [date]), 0)),
              Style112 AS CONVERT(CHAR(8), [date], 112),
              Style101 AS CONVERT(CHAR(10), [date], 101)
              );

              -- use the catalog views to generate as many rows as we need

              INSERT #dim([date])
              SELECT d
              FROM
              (
              SELECT d = DATEADD(DAY, rn - 1, @StartDate)
              FROM
              (
              SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
              rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
              FROM sys.all_objects AS s1
              CROSS JOIN sys.all_objects AS s2
              -- on my system this would support > 5 million days
              ORDER BY s1.[object_id]
              ) AS x
              ) AS y;

              drop table if exists dbo.DateDimension

              CREATE TABLE dbo.DateDimension
              (
              --DateKey INT NOT NULL PRIMARY KEY,
              [Date] DATE NOT NULL,
              [Day] TINYINT NOT NULL,
              DaySuffix CHAR(2) NOT NULL,
              [Weekday] TINYINT NOT NULL,
              WeekDayName VARCHAR(10) NOT NULL,
              IsWeekend BIT NOT NULL,
              IsHoliday BIT NOT NULL,
              HolidayText VARCHAR(64) SPARSE,
              DOWInMonth TINYINT NOT NULL,
              [DayOfYear] SMALLINT NOT NULL,
              WeekOfMonth TINYINT NOT NULL,
              WeekOfYear TINYINT NOT NULL,
              ISOWeekOfYear TINYINT NOT NULL,
              [Month] TINYINT NOT NULL,
              [MonthName] VARCHAR(10) NOT NULL,
              [Quarter] TINYINT NOT NULL,
              QuarterName VARCHAR(6) NOT NULL,
              [Year] INT NOT NULL,
              MMYYYY CHAR(6) NOT NULL,
              MonthYear CHAR(7) NOT NULL,
              FirstDayOfMonth DATE NOT NULL,
              LastDayOfMonth DATE NOT NULL,
              FirstDayOfQuarter DATE NOT NULL,
              LastDayOfQuarter DATE NOT NULL,
              FirstDayOfYear DATE NOT NULL,
              LastDayOfYear DATE NOT NULL,
              FirstDayOfNextMonth DATE NOT NULL,
              FirstDayOfNextYear DATE NOT NULL
              );
              INSERT dbo.DateDimension WITH (TABLOCKX)
              SELECT
              --DateKey = CONVERT(INT, Style112),
              [Date] = [date],
              [Day] = CONVERT(TINYINT, [day]),
              DaySuffix = CONVERT(CHAR(2), CASE WHEN [day] / 10 = 1 THEN 'th' ELSE
              CASE RIGHT([day], 1) WHEN '1' THEN 'st' WHEN '2' THEN 'nd'
              WHEN '3' THEN 'rd' ELSE 'th' END END),
              [Weekday] = CONVERT(TINYINT, [DayOfWeek]),
              [WeekDayName] = CONVERT(VARCHAR(10), DATENAME(WEEKDAY, [date])),
              [IsWeekend] = CONVERT(BIT, CASE WHEN [DayOfWeek] IN (1,7) THEN 1 ELSE 0 END),
              [IsHoliday] = CONVERT(BIT, 0),
              HolidayText = CONVERT(VARCHAR(64), NULL),
              [DOWInMonth] = CONVERT(TINYINT, ROW_NUMBER() OVER
              (PARTITION BY FirstOfMonth, [DayOfWeek] ORDER BY [date])),
              [DayOfYear] = CONVERT(SMALLINT, DATEPART(DAYOFYEAR, [date])),
              WeekOfMonth = CONVERT(TINYINT, DENSE_RANK() OVER
              (PARTITION BY [year], [month] ORDER BY [week])),
              WeekOfYear = CONVERT(TINYINT, [week]),
              ISOWeekOfYear = CONVERT(TINYINT, ISOWeek),
              [Month] = CONVERT(TINYINT, [month]),
              [MonthName] = CONVERT(VARCHAR(10), [MonthName]),
              [Quarter] = CONVERT(TINYINT, [quarter]),
              QuarterName = CONVERT(VARCHAR(6), CASE [quarter] WHEN 1 THEN 'First'
              WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' WHEN 4 THEN 'Fourth' END),
              [Year] = [year],
              MMYYYY = CONVERT(CHAR(6), LEFT(Style101, 2) + LEFT(Style112, 4)),
              MonthYear = CONVERT(CHAR(7), LEFT([MonthName], 3) + LEFT(Style112, 4)),
              FirstDayOfMonth = FirstOfMonth,
              LastDayOfMonth = MAX([date]) OVER (PARTITION BY [year], [month]),
              FirstDayOfQuarter = MIN([date]) OVER (PARTITION BY [year], [quarter]),
              LastDayOfQuarter = MAX([date]) OVER (PARTITION BY [year], [quarter]),
              FirstDayOfYear = FirstOfYear,
              LastDayOfYear = MAX([date]) OVER (PARTITION BY [year]),
              FirstDayOfNextMonth = DATEADD(MONTH, 1, FirstOfMonth),
              FirstDayOfNextYear = DATEADD(YEAR, 1, FirstOfYear)
              FROM #dim
              OPTION (MAXDOP 1);




              --solution
              SELECT min(Date)
              FROM [Test].[dbo].[DateDimension]
              where [year] = 2018 and [Quarter]=4




              | Date       |
              |------------|
              | 2018-10-01 |





              share|improve this answer





















                Your Answer








                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "182"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: false,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: null,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f226838%2fwhat-is-the-best-way-to-rebuild-a-date-from-integer-inputs%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                3 Answers
                3






                active

                oldest

                votes








                3 Answers
                3






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                5














                Let me suggest to NOT use a date separator like '-' or '/', it deppends on regional settings, use YYYYMMDD format.



                declare @quarter int,
                @year int,
                @date date

                set @quarter = 4
                set @year = 2018


                set @date = cast(@year as varchar(4)) + '0101'
                set @date = dateadd(quarter, 1 - 1, @date)
                print @date

                set @date = cast(@year as varchar(4)) + '0101'
                set @date = dateadd(quarter, 2 - 1, @date)
                print @date

                set @date = cast(@year as varchar(4)) + '0101'
                set @date = dateadd(quarter, 3 - 1, @date)
                print @date

                set @date = cast(@year as varchar(4)) + '0101'
                set @date = dateadd(quarter, 4 - 1, @date)
                print @date




                2018-01-01
                2018-04-01
                2018-07-01
                2018-10-01


                db<>fiddle here






                share|improve this answer


























                  5














                  Let me suggest to NOT use a date separator like '-' or '/', it deppends on regional settings, use YYYYMMDD format.



                  declare @quarter int,
                  @year int,
                  @date date

                  set @quarter = 4
                  set @year = 2018


                  set @date = cast(@year as varchar(4)) + '0101'
                  set @date = dateadd(quarter, 1 - 1, @date)
                  print @date

                  set @date = cast(@year as varchar(4)) + '0101'
                  set @date = dateadd(quarter, 2 - 1, @date)
                  print @date

                  set @date = cast(@year as varchar(4)) + '0101'
                  set @date = dateadd(quarter, 3 - 1, @date)
                  print @date

                  set @date = cast(@year as varchar(4)) + '0101'
                  set @date = dateadd(quarter, 4 - 1, @date)
                  print @date




                  2018-01-01
                  2018-04-01
                  2018-07-01
                  2018-10-01


                  db<>fiddle here






                  share|improve this answer
























                    5












                    5








                    5






                    Let me suggest to NOT use a date separator like '-' or '/', it deppends on regional settings, use YYYYMMDD format.



                    declare @quarter int,
                    @year int,
                    @date date

                    set @quarter = 4
                    set @year = 2018


                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 1 - 1, @date)
                    print @date

                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 2 - 1, @date)
                    print @date

                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 3 - 1, @date)
                    print @date

                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 4 - 1, @date)
                    print @date




                    2018-01-01
                    2018-04-01
                    2018-07-01
                    2018-10-01


                    db<>fiddle here






                    share|improve this answer












                    Let me suggest to NOT use a date separator like '-' or '/', it deppends on regional settings, use YYYYMMDD format.



                    declare @quarter int,
                    @year int,
                    @date date

                    set @quarter = 4
                    set @year = 2018


                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 1 - 1, @date)
                    print @date

                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 2 - 1, @date)
                    print @date

                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 3 - 1, @date)
                    print @date

                    set @date = cast(@year as varchar(4)) + '0101'
                    set @date = dateadd(quarter, 4 - 1, @date)
                    print @date




                    2018-01-01
                    2018-04-01
                    2018-07-01
                    2018-10-01


                    db<>fiddle here







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered 3 hours ago









                    McNetsMcNets

                    15.1k41858




                    15.1k41858

























                        3














                        How about



                        declare @quarter int = 4
                        declare @year int = 2018

                        select datefromparts(@year,(@quarter-1)*3+1,1)


                        or if you're still using SQL 2008:



                        select dateadd(month,(@quarter-1)*3,dateadd(year, @year-2018,'20180101'))





                        share|improve this answer


























                          3














                          How about



                          declare @quarter int = 4
                          declare @year int = 2018

                          select datefromparts(@year,(@quarter-1)*3+1,1)


                          or if you're still using SQL 2008:



                          select dateadd(month,(@quarter-1)*3,dateadd(year, @year-2018,'20180101'))





                          share|improve this answer
























                            3












                            3








                            3






                            How about



                            declare @quarter int = 4
                            declare @year int = 2018

                            select datefromparts(@year,(@quarter-1)*3+1,1)


                            or if you're still using SQL 2008:



                            select dateadd(month,(@quarter-1)*3,dateadd(year, @year-2018,'20180101'))





                            share|improve this answer












                            How about



                            declare @quarter int = 4
                            declare @year int = 2018

                            select datefromparts(@year,(@quarter-1)*3+1,1)


                            or if you're still using SQL 2008:



                            select dateadd(month,(@quarter-1)*3,dateadd(year, @year-2018,'20180101'))






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered 2 hours ago









                            David Browne - MicrosoftDavid Browne - Microsoft

                            10.6k726




                            10.6k726























                                2














                                You could Create a date dimension or calendar table in SQL Server and query it



                                --demo setup 
                                drop table if exists #dim
                                DECLARE @StartDate DATE = '20000101', @NumberOfYears INT = 30;

                                -- prevent set or regional settings from interfering with
                                -- interpretation of dates / literals

                                SET DATEFIRST 7;
                                SET DATEFORMAT mdy;
                                SET LANGUAGE US_ENGLISH;

                                DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

                                -- this is just a holding table for intermediate calculations:

                                CREATE TABLE #dim
                                (
                                [date] DATE PRIMARY KEY,
                                [day] AS DATEPART(DAY, [date]),
                                [month] AS DATEPART(MONTH, [date]),
                                FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
                                [MonthName] AS DATENAME(MONTH, [date]),
                                [week] AS DATEPART(WEEK, [date]),
                                [ISOweek] AS DATEPART(ISO_WEEK, [date]),
                                [DayOfWeek] AS DATEPART(WEEKDAY, [date]),
                                [quarter] AS DATEPART(QUARTER, [date]),
                                [year] AS DATEPART(YEAR, [date]),
                                FirstOfYear AS CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, [date]), 0)),
                                Style112 AS CONVERT(CHAR(8), [date], 112),
                                Style101 AS CONVERT(CHAR(10), [date], 101)
                                );

                                -- use the catalog views to generate as many rows as we need

                                INSERT #dim([date])
                                SELECT d
                                FROM
                                (
                                SELECT d = DATEADD(DAY, rn - 1, @StartDate)
                                FROM
                                (
                                SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
                                rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
                                FROM sys.all_objects AS s1
                                CROSS JOIN sys.all_objects AS s2
                                -- on my system this would support > 5 million days
                                ORDER BY s1.[object_id]
                                ) AS x
                                ) AS y;

                                drop table if exists dbo.DateDimension

                                CREATE TABLE dbo.DateDimension
                                (
                                --DateKey INT NOT NULL PRIMARY KEY,
                                [Date] DATE NOT NULL,
                                [Day] TINYINT NOT NULL,
                                DaySuffix CHAR(2) NOT NULL,
                                [Weekday] TINYINT NOT NULL,
                                WeekDayName VARCHAR(10) NOT NULL,
                                IsWeekend BIT NOT NULL,
                                IsHoliday BIT NOT NULL,
                                HolidayText VARCHAR(64) SPARSE,
                                DOWInMonth TINYINT NOT NULL,
                                [DayOfYear] SMALLINT NOT NULL,
                                WeekOfMonth TINYINT NOT NULL,
                                WeekOfYear TINYINT NOT NULL,
                                ISOWeekOfYear TINYINT NOT NULL,
                                [Month] TINYINT NOT NULL,
                                [MonthName] VARCHAR(10) NOT NULL,
                                [Quarter] TINYINT NOT NULL,
                                QuarterName VARCHAR(6) NOT NULL,
                                [Year] INT NOT NULL,
                                MMYYYY CHAR(6) NOT NULL,
                                MonthYear CHAR(7) NOT NULL,
                                FirstDayOfMonth DATE NOT NULL,
                                LastDayOfMonth DATE NOT NULL,
                                FirstDayOfQuarter DATE NOT NULL,
                                LastDayOfQuarter DATE NOT NULL,
                                FirstDayOfYear DATE NOT NULL,
                                LastDayOfYear DATE NOT NULL,
                                FirstDayOfNextMonth DATE NOT NULL,
                                FirstDayOfNextYear DATE NOT NULL
                                );
                                INSERT dbo.DateDimension WITH (TABLOCKX)
                                SELECT
                                --DateKey = CONVERT(INT, Style112),
                                [Date] = [date],
                                [Day] = CONVERT(TINYINT, [day]),
                                DaySuffix = CONVERT(CHAR(2), CASE WHEN [day] / 10 = 1 THEN 'th' ELSE
                                CASE RIGHT([day], 1) WHEN '1' THEN 'st' WHEN '2' THEN 'nd'
                                WHEN '3' THEN 'rd' ELSE 'th' END END),
                                [Weekday] = CONVERT(TINYINT, [DayOfWeek]),
                                [WeekDayName] = CONVERT(VARCHAR(10), DATENAME(WEEKDAY, [date])),
                                [IsWeekend] = CONVERT(BIT, CASE WHEN [DayOfWeek] IN (1,7) THEN 1 ELSE 0 END),
                                [IsHoliday] = CONVERT(BIT, 0),
                                HolidayText = CONVERT(VARCHAR(64), NULL),
                                [DOWInMonth] = CONVERT(TINYINT, ROW_NUMBER() OVER
                                (PARTITION BY FirstOfMonth, [DayOfWeek] ORDER BY [date])),
                                [DayOfYear] = CONVERT(SMALLINT, DATEPART(DAYOFYEAR, [date])),
                                WeekOfMonth = CONVERT(TINYINT, DENSE_RANK() OVER
                                (PARTITION BY [year], [month] ORDER BY [week])),
                                WeekOfYear = CONVERT(TINYINT, [week]),
                                ISOWeekOfYear = CONVERT(TINYINT, ISOWeek),
                                [Month] = CONVERT(TINYINT, [month]),
                                [MonthName] = CONVERT(VARCHAR(10), [MonthName]),
                                [Quarter] = CONVERT(TINYINT, [quarter]),
                                QuarterName = CONVERT(VARCHAR(6), CASE [quarter] WHEN 1 THEN 'First'
                                WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' WHEN 4 THEN 'Fourth' END),
                                [Year] = [year],
                                MMYYYY = CONVERT(CHAR(6), LEFT(Style101, 2) + LEFT(Style112, 4)),
                                MonthYear = CONVERT(CHAR(7), LEFT([MonthName], 3) + LEFT(Style112, 4)),
                                FirstDayOfMonth = FirstOfMonth,
                                LastDayOfMonth = MAX([date]) OVER (PARTITION BY [year], [month]),
                                FirstDayOfQuarter = MIN([date]) OVER (PARTITION BY [year], [quarter]),
                                LastDayOfQuarter = MAX([date]) OVER (PARTITION BY [year], [quarter]),
                                FirstDayOfYear = FirstOfYear,
                                LastDayOfYear = MAX([date]) OVER (PARTITION BY [year]),
                                FirstDayOfNextMonth = DATEADD(MONTH, 1, FirstOfMonth),
                                FirstDayOfNextYear = DATEADD(YEAR, 1, FirstOfYear)
                                FROM #dim
                                OPTION (MAXDOP 1);




                                --solution
                                SELECT min(Date)
                                FROM [Test].[dbo].[DateDimension]
                                where [year] = 2018 and [Quarter]=4




                                | Date       |
                                |------------|
                                | 2018-10-01 |





                                share|improve this answer


























                                  2














                                  You could Create a date dimension or calendar table in SQL Server and query it



                                  --demo setup 
                                  drop table if exists #dim
                                  DECLARE @StartDate DATE = '20000101', @NumberOfYears INT = 30;

                                  -- prevent set or regional settings from interfering with
                                  -- interpretation of dates / literals

                                  SET DATEFIRST 7;
                                  SET DATEFORMAT mdy;
                                  SET LANGUAGE US_ENGLISH;

                                  DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

                                  -- this is just a holding table for intermediate calculations:

                                  CREATE TABLE #dim
                                  (
                                  [date] DATE PRIMARY KEY,
                                  [day] AS DATEPART(DAY, [date]),
                                  [month] AS DATEPART(MONTH, [date]),
                                  FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
                                  [MonthName] AS DATENAME(MONTH, [date]),
                                  [week] AS DATEPART(WEEK, [date]),
                                  [ISOweek] AS DATEPART(ISO_WEEK, [date]),
                                  [DayOfWeek] AS DATEPART(WEEKDAY, [date]),
                                  [quarter] AS DATEPART(QUARTER, [date]),
                                  [year] AS DATEPART(YEAR, [date]),
                                  FirstOfYear AS CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, [date]), 0)),
                                  Style112 AS CONVERT(CHAR(8), [date], 112),
                                  Style101 AS CONVERT(CHAR(10), [date], 101)
                                  );

                                  -- use the catalog views to generate as many rows as we need

                                  INSERT #dim([date])
                                  SELECT d
                                  FROM
                                  (
                                  SELECT d = DATEADD(DAY, rn - 1, @StartDate)
                                  FROM
                                  (
                                  SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
                                  rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
                                  FROM sys.all_objects AS s1
                                  CROSS JOIN sys.all_objects AS s2
                                  -- on my system this would support > 5 million days
                                  ORDER BY s1.[object_id]
                                  ) AS x
                                  ) AS y;

                                  drop table if exists dbo.DateDimension

                                  CREATE TABLE dbo.DateDimension
                                  (
                                  --DateKey INT NOT NULL PRIMARY KEY,
                                  [Date] DATE NOT NULL,
                                  [Day] TINYINT NOT NULL,
                                  DaySuffix CHAR(2) NOT NULL,
                                  [Weekday] TINYINT NOT NULL,
                                  WeekDayName VARCHAR(10) NOT NULL,
                                  IsWeekend BIT NOT NULL,
                                  IsHoliday BIT NOT NULL,
                                  HolidayText VARCHAR(64) SPARSE,
                                  DOWInMonth TINYINT NOT NULL,
                                  [DayOfYear] SMALLINT NOT NULL,
                                  WeekOfMonth TINYINT NOT NULL,
                                  WeekOfYear TINYINT NOT NULL,
                                  ISOWeekOfYear TINYINT NOT NULL,
                                  [Month] TINYINT NOT NULL,
                                  [MonthName] VARCHAR(10) NOT NULL,
                                  [Quarter] TINYINT NOT NULL,
                                  QuarterName VARCHAR(6) NOT NULL,
                                  [Year] INT NOT NULL,
                                  MMYYYY CHAR(6) NOT NULL,
                                  MonthYear CHAR(7) NOT NULL,
                                  FirstDayOfMonth DATE NOT NULL,
                                  LastDayOfMonth DATE NOT NULL,
                                  FirstDayOfQuarter DATE NOT NULL,
                                  LastDayOfQuarter DATE NOT NULL,
                                  FirstDayOfYear DATE NOT NULL,
                                  LastDayOfYear DATE NOT NULL,
                                  FirstDayOfNextMonth DATE NOT NULL,
                                  FirstDayOfNextYear DATE NOT NULL
                                  );
                                  INSERT dbo.DateDimension WITH (TABLOCKX)
                                  SELECT
                                  --DateKey = CONVERT(INT, Style112),
                                  [Date] = [date],
                                  [Day] = CONVERT(TINYINT, [day]),
                                  DaySuffix = CONVERT(CHAR(2), CASE WHEN [day] / 10 = 1 THEN 'th' ELSE
                                  CASE RIGHT([day], 1) WHEN '1' THEN 'st' WHEN '2' THEN 'nd'
                                  WHEN '3' THEN 'rd' ELSE 'th' END END),
                                  [Weekday] = CONVERT(TINYINT, [DayOfWeek]),
                                  [WeekDayName] = CONVERT(VARCHAR(10), DATENAME(WEEKDAY, [date])),
                                  [IsWeekend] = CONVERT(BIT, CASE WHEN [DayOfWeek] IN (1,7) THEN 1 ELSE 0 END),
                                  [IsHoliday] = CONVERT(BIT, 0),
                                  HolidayText = CONVERT(VARCHAR(64), NULL),
                                  [DOWInMonth] = CONVERT(TINYINT, ROW_NUMBER() OVER
                                  (PARTITION BY FirstOfMonth, [DayOfWeek] ORDER BY [date])),
                                  [DayOfYear] = CONVERT(SMALLINT, DATEPART(DAYOFYEAR, [date])),
                                  WeekOfMonth = CONVERT(TINYINT, DENSE_RANK() OVER
                                  (PARTITION BY [year], [month] ORDER BY [week])),
                                  WeekOfYear = CONVERT(TINYINT, [week]),
                                  ISOWeekOfYear = CONVERT(TINYINT, ISOWeek),
                                  [Month] = CONVERT(TINYINT, [month]),
                                  [MonthName] = CONVERT(VARCHAR(10), [MonthName]),
                                  [Quarter] = CONVERT(TINYINT, [quarter]),
                                  QuarterName = CONVERT(VARCHAR(6), CASE [quarter] WHEN 1 THEN 'First'
                                  WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' WHEN 4 THEN 'Fourth' END),
                                  [Year] = [year],
                                  MMYYYY = CONVERT(CHAR(6), LEFT(Style101, 2) + LEFT(Style112, 4)),
                                  MonthYear = CONVERT(CHAR(7), LEFT([MonthName], 3) + LEFT(Style112, 4)),
                                  FirstDayOfMonth = FirstOfMonth,
                                  LastDayOfMonth = MAX([date]) OVER (PARTITION BY [year], [month]),
                                  FirstDayOfQuarter = MIN([date]) OVER (PARTITION BY [year], [quarter]),
                                  LastDayOfQuarter = MAX([date]) OVER (PARTITION BY [year], [quarter]),
                                  FirstDayOfYear = FirstOfYear,
                                  LastDayOfYear = MAX([date]) OVER (PARTITION BY [year]),
                                  FirstDayOfNextMonth = DATEADD(MONTH, 1, FirstOfMonth),
                                  FirstDayOfNextYear = DATEADD(YEAR, 1, FirstOfYear)
                                  FROM #dim
                                  OPTION (MAXDOP 1);




                                  --solution
                                  SELECT min(Date)
                                  FROM [Test].[dbo].[DateDimension]
                                  where [year] = 2018 and [Quarter]=4




                                  | Date       |
                                  |------------|
                                  | 2018-10-01 |





                                  share|improve this answer
























                                    2












                                    2








                                    2






                                    You could Create a date dimension or calendar table in SQL Server and query it



                                    --demo setup 
                                    drop table if exists #dim
                                    DECLARE @StartDate DATE = '20000101', @NumberOfYears INT = 30;

                                    -- prevent set or regional settings from interfering with
                                    -- interpretation of dates / literals

                                    SET DATEFIRST 7;
                                    SET DATEFORMAT mdy;
                                    SET LANGUAGE US_ENGLISH;

                                    DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

                                    -- this is just a holding table for intermediate calculations:

                                    CREATE TABLE #dim
                                    (
                                    [date] DATE PRIMARY KEY,
                                    [day] AS DATEPART(DAY, [date]),
                                    [month] AS DATEPART(MONTH, [date]),
                                    FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
                                    [MonthName] AS DATENAME(MONTH, [date]),
                                    [week] AS DATEPART(WEEK, [date]),
                                    [ISOweek] AS DATEPART(ISO_WEEK, [date]),
                                    [DayOfWeek] AS DATEPART(WEEKDAY, [date]),
                                    [quarter] AS DATEPART(QUARTER, [date]),
                                    [year] AS DATEPART(YEAR, [date]),
                                    FirstOfYear AS CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, [date]), 0)),
                                    Style112 AS CONVERT(CHAR(8), [date], 112),
                                    Style101 AS CONVERT(CHAR(10), [date], 101)
                                    );

                                    -- use the catalog views to generate as many rows as we need

                                    INSERT #dim([date])
                                    SELECT d
                                    FROM
                                    (
                                    SELECT d = DATEADD(DAY, rn - 1, @StartDate)
                                    FROM
                                    (
                                    SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
                                    rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
                                    FROM sys.all_objects AS s1
                                    CROSS JOIN sys.all_objects AS s2
                                    -- on my system this would support > 5 million days
                                    ORDER BY s1.[object_id]
                                    ) AS x
                                    ) AS y;

                                    drop table if exists dbo.DateDimension

                                    CREATE TABLE dbo.DateDimension
                                    (
                                    --DateKey INT NOT NULL PRIMARY KEY,
                                    [Date] DATE NOT NULL,
                                    [Day] TINYINT NOT NULL,
                                    DaySuffix CHAR(2) NOT NULL,
                                    [Weekday] TINYINT NOT NULL,
                                    WeekDayName VARCHAR(10) NOT NULL,
                                    IsWeekend BIT NOT NULL,
                                    IsHoliday BIT NOT NULL,
                                    HolidayText VARCHAR(64) SPARSE,
                                    DOWInMonth TINYINT NOT NULL,
                                    [DayOfYear] SMALLINT NOT NULL,
                                    WeekOfMonth TINYINT NOT NULL,
                                    WeekOfYear TINYINT NOT NULL,
                                    ISOWeekOfYear TINYINT NOT NULL,
                                    [Month] TINYINT NOT NULL,
                                    [MonthName] VARCHAR(10) NOT NULL,
                                    [Quarter] TINYINT NOT NULL,
                                    QuarterName VARCHAR(6) NOT NULL,
                                    [Year] INT NOT NULL,
                                    MMYYYY CHAR(6) NOT NULL,
                                    MonthYear CHAR(7) NOT NULL,
                                    FirstDayOfMonth DATE NOT NULL,
                                    LastDayOfMonth DATE NOT NULL,
                                    FirstDayOfQuarter DATE NOT NULL,
                                    LastDayOfQuarter DATE NOT NULL,
                                    FirstDayOfYear DATE NOT NULL,
                                    LastDayOfYear DATE NOT NULL,
                                    FirstDayOfNextMonth DATE NOT NULL,
                                    FirstDayOfNextYear DATE NOT NULL
                                    );
                                    INSERT dbo.DateDimension WITH (TABLOCKX)
                                    SELECT
                                    --DateKey = CONVERT(INT, Style112),
                                    [Date] = [date],
                                    [Day] = CONVERT(TINYINT, [day]),
                                    DaySuffix = CONVERT(CHAR(2), CASE WHEN [day] / 10 = 1 THEN 'th' ELSE
                                    CASE RIGHT([day], 1) WHEN '1' THEN 'st' WHEN '2' THEN 'nd'
                                    WHEN '3' THEN 'rd' ELSE 'th' END END),
                                    [Weekday] = CONVERT(TINYINT, [DayOfWeek]),
                                    [WeekDayName] = CONVERT(VARCHAR(10), DATENAME(WEEKDAY, [date])),
                                    [IsWeekend] = CONVERT(BIT, CASE WHEN [DayOfWeek] IN (1,7) THEN 1 ELSE 0 END),
                                    [IsHoliday] = CONVERT(BIT, 0),
                                    HolidayText = CONVERT(VARCHAR(64), NULL),
                                    [DOWInMonth] = CONVERT(TINYINT, ROW_NUMBER() OVER
                                    (PARTITION BY FirstOfMonth, [DayOfWeek] ORDER BY [date])),
                                    [DayOfYear] = CONVERT(SMALLINT, DATEPART(DAYOFYEAR, [date])),
                                    WeekOfMonth = CONVERT(TINYINT, DENSE_RANK() OVER
                                    (PARTITION BY [year], [month] ORDER BY [week])),
                                    WeekOfYear = CONVERT(TINYINT, [week]),
                                    ISOWeekOfYear = CONVERT(TINYINT, ISOWeek),
                                    [Month] = CONVERT(TINYINT, [month]),
                                    [MonthName] = CONVERT(VARCHAR(10), [MonthName]),
                                    [Quarter] = CONVERT(TINYINT, [quarter]),
                                    QuarterName = CONVERT(VARCHAR(6), CASE [quarter] WHEN 1 THEN 'First'
                                    WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' WHEN 4 THEN 'Fourth' END),
                                    [Year] = [year],
                                    MMYYYY = CONVERT(CHAR(6), LEFT(Style101, 2) + LEFT(Style112, 4)),
                                    MonthYear = CONVERT(CHAR(7), LEFT([MonthName], 3) + LEFT(Style112, 4)),
                                    FirstDayOfMonth = FirstOfMonth,
                                    LastDayOfMonth = MAX([date]) OVER (PARTITION BY [year], [month]),
                                    FirstDayOfQuarter = MIN([date]) OVER (PARTITION BY [year], [quarter]),
                                    LastDayOfQuarter = MAX([date]) OVER (PARTITION BY [year], [quarter]),
                                    FirstDayOfYear = FirstOfYear,
                                    LastDayOfYear = MAX([date]) OVER (PARTITION BY [year]),
                                    FirstDayOfNextMonth = DATEADD(MONTH, 1, FirstOfMonth),
                                    FirstDayOfNextYear = DATEADD(YEAR, 1, FirstOfYear)
                                    FROM #dim
                                    OPTION (MAXDOP 1);




                                    --solution
                                    SELECT min(Date)
                                    FROM [Test].[dbo].[DateDimension]
                                    where [year] = 2018 and [Quarter]=4




                                    | Date       |
                                    |------------|
                                    | 2018-10-01 |





                                    share|improve this answer












                                    You could Create a date dimension or calendar table in SQL Server and query it



                                    --demo setup 
                                    drop table if exists #dim
                                    DECLARE @StartDate DATE = '20000101', @NumberOfYears INT = 30;

                                    -- prevent set or regional settings from interfering with
                                    -- interpretation of dates / literals

                                    SET DATEFIRST 7;
                                    SET DATEFORMAT mdy;
                                    SET LANGUAGE US_ENGLISH;

                                    DECLARE @CutoffDate DATE = DATEADD(YEAR, @NumberOfYears, @StartDate);

                                    -- this is just a holding table for intermediate calculations:

                                    CREATE TABLE #dim
                                    (
                                    [date] DATE PRIMARY KEY,
                                    [day] AS DATEPART(DAY, [date]),
                                    [month] AS DATEPART(MONTH, [date]),
                                    FirstOfMonth AS CONVERT(DATE, DATEADD(MONTH, DATEDIFF(MONTH, 0, [date]), 0)),
                                    [MonthName] AS DATENAME(MONTH, [date]),
                                    [week] AS DATEPART(WEEK, [date]),
                                    [ISOweek] AS DATEPART(ISO_WEEK, [date]),
                                    [DayOfWeek] AS DATEPART(WEEKDAY, [date]),
                                    [quarter] AS DATEPART(QUARTER, [date]),
                                    [year] AS DATEPART(YEAR, [date]),
                                    FirstOfYear AS CONVERT(DATE, DATEADD(YEAR, DATEDIFF(YEAR, 0, [date]), 0)),
                                    Style112 AS CONVERT(CHAR(8), [date], 112),
                                    Style101 AS CONVERT(CHAR(10), [date], 101)
                                    );

                                    -- use the catalog views to generate as many rows as we need

                                    INSERT #dim([date])
                                    SELECT d
                                    FROM
                                    (
                                    SELECT d = DATEADD(DAY, rn - 1, @StartDate)
                                    FROM
                                    (
                                    SELECT TOP (DATEDIFF(DAY, @StartDate, @CutoffDate))
                                    rn = ROW_NUMBER() OVER (ORDER BY s1.[object_id])
                                    FROM sys.all_objects AS s1
                                    CROSS JOIN sys.all_objects AS s2
                                    -- on my system this would support > 5 million days
                                    ORDER BY s1.[object_id]
                                    ) AS x
                                    ) AS y;

                                    drop table if exists dbo.DateDimension

                                    CREATE TABLE dbo.DateDimension
                                    (
                                    --DateKey INT NOT NULL PRIMARY KEY,
                                    [Date] DATE NOT NULL,
                                    [Day] TINYINT NOT NULL,
                                    DaySuffix CHAR(2) NOT NULL,
                                    [Weekday] TINYINT NOT NULL,
                                    WeekDayName VARCHAR(10) NOT NULL,
                                    IsWeekend BIT NOT NULL,
                                    IsHoliday BIT NOT NULL,
                                    HolidayText VARCHAR(64) SPARSE,
                                    DOWInMonth TINYINT NOT NULL,
                                    [DayOfYear] SMALLINT NOT NULL,
                                    WeekOfMonth TINYINT NOT NULL,
                                    WeekOfYear TINYINT NOT NULL,
                                    ISOWeekOfYear TINYINT NOT NULL,
                                    [Month] TINYINT NOT NULL,
                                    [MonthName] VARCHAR(10) NOT NULL,
                                    [Quarter] TINYINT NOT NULL,
                                    QuarterName VARCHAR(6) NOT NULL,
                                    [Year] INT NOT NULL,
                                    MMYYYY CHAR(6) NOT NULL,
                                    MonthYear CHAR(7) NOT NULL,
                                    FirstDayOfMonth DATE NOT NULL,
                                    LastDayOfMonth DATE NOT NULL,
                                    FirstDayOfQuarter DATE NOT NULL,
                                    LastDayOfQuarter DATE NOT NULL,
                                    FirstDayOfYear DATE NOT NULL,
                                    LastDayOfYear DATE NOT NULL,
                                    FirstDayOfNextMonth DATE NOT NULL,
                                    FirstDayOfNextYear DATE NOT NULL
                                    );
                                    INSERT dbo.DateDimension WITH (TABLOCKX)
                                    SELECT
                                    --DateKey = CONVERT(INT, Style112),
                                    [Date] = [date],
                                    [Day] = CONVERT(TINYINT, [day]),
                                    DaySuffix = CONVERT(CHAR(2), CASE WHEN [day] / 10 = 1 THEN 'th' ELSE
                                    CASE RIGHT([day], 1) WHEN '1' THEN 'st' WHEN '2' THEN 'nd'
                                    WHEN '3' THEN 'rd' ELSE 'th' END END),
                                    [Weekday] = CONVERT(TINYINT, [DayOfWeek]),
                                    [WeekDayName] = CONVERT(VARCHAR(10), DATENAME(WEEKDAY, [date])),
                                    [IsWeekend] = CONVERT(BIT, CASE WHEN [DayOfWeek] IN (1,7) THEN 1 ELSE 0 END),
                                    [IsHoliday] = CONVERT(BIT, 0),
                                    HolidayText = CONVERT(VARCHAR(64), NULL),
                                    [DOWInMonth] = CONVERT(TINYINT, ROW_NUMBER() OVER
                                    (PARTITION BY FirstOfMonth, [DayOfWeek] ORDER BY [date])),
                                    [DayOfYear] = CONVERT(SMALLINT, DATEPART(DAYOFYEAR, [date])),
                                    WeekOfMonth = CONVERT(TINYINT, DENSE_RANK() OVER
                                    (PARTITION BY [year], [month] ORDER BY [week])),
                                    WeekOfYear = CONVERT(TINYINT, [week]),
                                    ISOWeekOfYear = CONVERT(TINYINT, ISOWeek),
                                    [Month] = CONVERT(TINYINT, [month]),
                                    [MonthName] = CONVERT(VARCHAR(10), [MonthName]),
                                    [Quarter] = CONVERT(TINYINT, [quarter]),
                                    QuarterName = CONVERT(VARCHAR(6), CASE [quarter] WHEN 1 THEN 'First'
                                    WHEN 2 THEN 'Second' WHEN 3 THEN 'Third' WHEN 4 THEN 'Fourth' END),
                                    [Year] = [year],
                                    MMYYYY = CONVERT(CHAR(6), LEFT(Style101, 2) + LEFT(Style112, 4)),
                                    MonthYear = CONVERT(CHAR(7), LEFT([MonthName], 3) + LEFT(Style112, 4)),
                                    FirstDayOfMonth = FirstOfMonth,
                                    LastDayOfMonth = MAX([date]) OVER (PARTITION BY [year], [month]),
                                    FirstDayOfQuarter = MIN([date]) OVER (PARTITION BY [year], [quarter]),
                                    LastDayOfQuarter = MAX([date]) OVER (PARTITION BY [year], [quarter]),
                                    FirstDayOfYear = FirstOfYear,
                                    LastDayOfYear = MAX([date]) OVER (PARTITION BY [year]),
                                    FirstDayOfNextMonth = DATEADD(MONTH, 1, FirstOfMonth),
                                    FirstDayOfNextYear = DATEADD(YEAR, 1, FirstOfYear)
                                    FROM #dim
                                    OPTION (MAXDOP 1);




                                    --solution
                                    SELECT min(Date)
                                    FROM [Test].[dbo].[DateDimension]
                                    where [year] = 2018 and [Quarter]=4




                                    | Date       |
                                    |------------|
                                    | 2018-10-01 |






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered 2 hours ago









                                    Scott HodginScott Hodgin

                                    16.9k21534




                                    16.9k21534






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Database Administrators Stack Exchange!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f226838%2fwhat-is-the-best-way-to-rebuild-a-date-from-integer-inputs%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        Lallio

                                        Unable to find Lightning Node

                                        Futebolista