【问题标题】:Fixed date with variable year (SQL Server)具有可变年份的固定日期(SQL Server)
【发布时间】:2014-10-14 13:37:49
【问题描述】:

我正在尝试为去年、今年和明年设置每年的固定日期,例如 11 月 1 日。

我可以宣布我的岁月

 declare @lastyear  int;    set @lastyear = year (getdate()-365) 
 declare @thisyear  int;    set @thisyear = year (getdate()) 
 declare @nextyear  int;    set @nextyear = year (getdate()+365)

但是我很难知道如何每年设置一个固定日期。

我想声明固定的日期和月份,例如

declare @fixeddate; set @fixeddate = CONVERT(VARCHAR(6), '2014.11.01', 107)

然后追加年份,但无处可去。

类似:

@nextyear + @fixeddate(作为日期!)

帮助 ;-)

【问题讨论】:

  • SELECT DATEFROMPARTS(@fixed_year, MONTH(@date), DAY(@date));

标签: sql-server date declare


【解决方案1】:

试试这样的:

DECLARE @fixedDate VARCHAR(4) = '1101'
DECLARE @addYears INT = 0 -- Add (+)/(-) values to get future and past years
DECLARE @currentYear VARCHAR(4) = CONVERT(VARCHAR(4), Year(Getdate()) + @addYears)

DECLARE @date DATE = CONVERT(DATE, @currentYear + @fixedDate)

如果您还需要包含time

DECLARE @fixedDate VARCHAR(13) = '1101 23:59:59' --Change the length as VARCHAR(13)
DECLARE @addYears INT = 0 -- Add (+)/(-) values to get future and past years
DECLARE @currentYear VARCHAR(4) = CONVERT(VARCHAR(4), Year(Getdate()) + @addYears)

--Declare @date as DATETIME and function as CONVERT(DATETIME, ...)
DECLARE @date DATETIME = CONVERT(DATETIME, @currentYear + @fixedDate)

【讨论】:

  • 你能建议 ho 在其中包含 hh:mm:ss,我试过 DECLARE @fixedDate VARCHAR(4) = '1101235959'。
【解决方案2】:
DECLARE @FixedDate DATE = '2014-11-01';
DECLARE @NextYearFixed DATE = DATEADD(year, 1, @FixedDate) -- 2015-11-01
DECLARE @PreviousYearFixed DATE = DATEADD(year, -1, @FixedDate) -- 2013-11-01

【讨论】:

  • 这可能会或可能不会返回每年的“11 月 1 日”。
  • @anonxen,这是为什么呢?
  • 哎呀!对不起我错了 !!似乎 DATEADD 只是按给定值递增/递减年份。我认为它增加了 365 天或类似的时间。
  • 谢谢@Namrehs!您帮助消除了一个误解。
【解决方案3】:

您可以使用DATEADD/DATEDIFF 对来完成此类工作:

select
  DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20011101') as NovThisYear,
  DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20001101') as NovLastYear,
  DATEADD(year,DATEDIFF(year,'20010101',GETDATE()),'20021101') as NovNextYear

您只需使用它们之间具有恒定关系的两个日期,以展示您想要的最终关系(例如,在上面的第二对中,我选择一年的 11 月 1 日('20001101'之前 第一次约会 ('20010101'))

结果:

NovThisYear             NovLastYear             NovNextYear
----------------------- ----------------------- -----------------------
2014-11-01 00:00:00.000 2013-11-01 00:00:00.000 2015-11-01 00:00:00.000

【讨论】:

    【解决方案4】:

    你可以这样做:

    DECLARE
        @lastyear  INT
        ;    
    SET 
        @lastyear = DATEPART(YEAR, GETDATE())
        ;
    DECLARE 
        @thisyear INT
        ;    
    SET
        @thisyear = @lastyear + 1
        ;
    DECLARE 
        @nextyear INT
        ;    
    SET
        @nextyear = @thisyear + 1
        ;
    
    DECLARE
        @fixeddate DATE
        ; 
    SET
        @fixeddate = CAST(CAST(@lastyear AS VARCHAR(4)) + '-' + CAST(11 AS VARCHAR(2)) + '-' + CAST(1 AS VARCHAR(2)) AS DATE)
        ;
    SELECT
        @fixeddate
        ;
    
    【解决方案5】:

    谢谢大家!

    我最终综合了您的所有建议来声明上一个、这个和下一个财政年度 (FY)。我们的日期是 11 月 1 日左右,但您可以使用任何日期!

    您只需要将 @today 替换为 getdate() 广告,它就会永远运行!您可以通过添加手动日期来测试它,如下面的示例......

    我坚持的一个问题是,最后一个日期看起来像是“2014.10.31 00:00:00”而不是“2014.10.31 23:59:59”

    您可以使用 DATEADD (S, 86399, @lastFYend) 将其选中,但我需要确保 @fixedend 包含小时分钟和秒。

    有什么建议吗?

    -- when are we now?
    Declare @today smalldatetime; set @today = '2014.10.14'   -- for testing, normally set to getdate()
    
    Declare @1NOVthisyear   AS smalldatetime;  Set @1NOVthisyear    = DATEADD(year,DATEDIFF(year,'20010101',@today),'20011101') 
    Declare @30Octlastyear  AS smalldatetime;  Set @30Octlastyear   = DATEADD(year,DATEDIFF(year,'20010101',@today),'20001031') 
    
    Declare @addyears INT; Set @addyears = (Select Case when @today >= @1NOVthisyear then 1 when @today < @1NOVthisyear then 0 END )
    
    -- FY start / End dates
    DECLARE @fixedstart     VARCHAR(4) = '1101'
    DECLARE @fixedend       VARCHAR(4) = '1031'
    
    DECLARE @nextnextYear   VARCHAR(4) = CONVERT(VARCHAR(4), Year(@today)   + @addYears +1)
    DECLARE @nextYear       VARCHAR(4) = CONVERT(VARCHAR(4), Year(@today)   + @addYears)
    DECLARE @thisYear       VARCHAR(4) = CONVERT(VARCHAR(4), Year(@today)   + (@addYears -1))
    DECLARE @lastYear       VARCHAR(4) = CONVERT(VARCHAR(4), Year(@today)   + (@addYears -2))
    --starts
    DECLARE @nextFYstart    DATEtime = CONVERT(smalldatetime, @nextYear     + @fixedstart)
    DECLARE @thisFYstart    DATEtime = CONVERT(smalldatetime, @thisYear     + @fixedstart)
    DECLARE @lastFYstart    DATEtime = CONVERT(smalldatetime, @lastYear     + @fixedstart)
    --ends
    DECLARE @nextFYend      DATEtime = CONVERT(smalldatetime, @nextnextYear + @fixedend)
    DECLARE @thisFYend      DATEtime = CONVERT(smalldatetime, @nextYear     + @fixedend)
    DECLARE @lastFYend      DATEtime = CONVERT(smalldatetime, @thisYear     + @fixedend)
    
    Select
    
    ---- testing
    --@lastFYstart                      As 'Last FY start', 
    --DATEADD (S, 86399, @lastFYend)        AS 'Last FY End',   
    --@thisFYstart                      As 'This FY start',
    --DATEADD (S, 86399, @thisFYend)        AS 'This FY End',
    --@nextFYstart                      As 'Next FY start',
    --DATEADD (S, 86399, @nextFYend)        AS 'Next FY End'
    

    【讨论】:

      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2019-07-07
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多