【问题标题】:How to get the first and last date of the current year?如何获取当年的第一个和最后一个日期?
【发布时间】:2012-11-06 09:42:34
【问题描述】:

使用 SQL Server 2000,如何获取当年的第一天和最后一天?

预期输出:

01/01/201231/12/2012

【问题讨论】:

    标签: sql sql-server sql-server-2000


    【解决方案1】:
    SELECT
       DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
       DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
    

    上面的查询给出了 12 月 31 日开始的午夜的日期时间值。这比一年中的最后一刻少了大约 24 小时。如果您想包括可能发生在 12 月 31 日的时间,那么您应该与下一年的第一天进行比较,并使用< 比较。或者您可以与当年的最后几毫秒进行比较,但是如果您使用 DATETIME 以外的其他内容(例如 DATETIME2),这仍然会留下差距:

    SELECT
       DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
       DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
       DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
       DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
    

    其他时期

    这种方法有两个很好的方面:良好的性能,并且可以通过用不同的字符串替换两个出现的 yy (=year) 来轻松更改其他时间段:

    yy, yyyy    year
    qq, q       quarter
    mm, m       month
    wk, ww      week 
    

    (注意周数:开始日期取决于服务器设置。)

    技术详情

    这可以通过使用DATEDIFF(yy, 0, GETDATE()) 计算自 1900 年以来的年数,然后将其添加到零日期 = 1900 年 1 月 1 日。可以通过替换 GETDATE() 部分将其更改为适用于任意日期或任意年份,将DATEDIFF(...) 函数替换为“Year - 1900”。

     SELECT
       DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
       DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015
    

    【讨论】:

      【解决方案2】:

      获取一年中的第一个日期和最后一个日期的最佳方法是

      SELECT CAST(CAST(YEAR(DATEADD(YEAR,-1,GETDATE())) AS VARCHAR) + '-' + '01' + '-' + '01' AS DATE) FIRST_DATE
      
      SELECT CAST(CAST(YEAR(DATEADD(YEAR,-1,GETDATE())) AS VARCHAR) + '-' + '12' + '-' + '31' AS DATE) LAST_DATE
      

      【讨论】:

        【解决方案3】:

        最好的方法是提取当前年份,然后像这样使用连接:

        SELECT CONCAT(year(now()), '-01-01') as start, -- fist day of current year
               CONCAT(year(now()), '-31-12') as end;   -- last day of current year
        

        这会给你:start : 2020-01-01 and end : 2020-31-12 日期格式。

        【讨论】:

        • 请对您的答案提供解释,而不仅仅是代码。
        • 我添加了一个简短但简洁的描述!
        【解决方案4】:

        如果它到了 1 月 1 日,您可能仍然是去年的日期。

        select
        convert(date, DATEADD(yy, DATEDIFF(yy, 0,  DATEadd(day, -1,getdate())), 0), 103 ) AS StartOfYear,
        convert(date, DATEADD(yy, DATEDIFF(yy, 0, DATEDIFF(day, -1,getdate()))+1, -1), 103 )AS EndOfYear
        

        【讨论】:

          【解决方案5】:

          这是一个相当简单的方法;

          SELECT DATEFROMPARTS(YEAR(GETDATE()), 1, 1) AS 'First Day of Current Year';
          SELECT DATEFROMPARTS(YEAR(GETDATE()), 12, 31) AS 'End of Current Year';
          

          这并不性感,但很有效。

          【讨论】:

          • 仅从 Sql Server 2012 开始可用。
          【解决方案6】:

          另一种方式:(自 SQL Server 2012 起)

          SELECT
              DATEFROMPARTS(YEAR(GETDATE()), 1, 1) FirstDay,
              DATEFROMPARTS(YEAR(GETDATE()),12,31) LastDay
          

          【讨论】:

            【解决方案7】:

            要获取一年中的第一天和最后一天,可以使用CONCAT 函数。结果值可以转换为任何类型。

            CONCAT(YEAR(Getdate()),'-01-01') FirstOfYear,
            CONCAT(YEAR(GETDATE()),'-12-31') LastOfYear
            

            【讨论】:

            • 年份对我不起作用,但 date_part 起作用 start_year_date := CONCAT(date_part('Y',start_date_p)::int::text,'-01-01')::date;跨度>
            【解决方案8】:

            在 Microsoft SQL Server (T-SQL) 中,可以按如下方式完成

            --beginning of year
            select '01/01/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))
            
            --end of year
            select '12/31/' + LTRIM(STR(YEAR(CURRENT_TIMESTAMP)))
            

            CURRENT_TIMESTAMP - 返回执行查询时的 sql server 日期。

            YEAR - 获取当前时间戳的年份部分。

            STR , LTRIM - 应用这两个函数,以便我们可以将其转换为可以与所需前缀连接的 varchar(在这种情况下,它要么是第一个一年的日期或一年的最后一天)。无论出于何种原因,YEAR 函数生成的结果都有前缀空格。为了修复它们,我们使用左修剪的 LTRIM 功能。

            【讨论】:

              【解决方案9】:

              看起来您对给定年份的所有操作都很感兴趣,如果确实如此,我建议您像这样使用YEAR() 函数:

              SELECT * FROM `table` WHERE YEAR(date_column) = '2012';
              

              DAY()MONTH() 也是如此。它们也可用于 MySQL/MariaDB 变体,并在 SQL Server 2008 中引入(因此不适用于特定的 2000)。

              【讨论】:

                【解决方案10】:
                print Cast('1/1/' + cast(datepart(yyyy, getdate()) as nvarchar(4)) as date)
                

                【讨论】:

                • 你应该解释你的代码。代码转储经常被否决,可能会被删除。
                【解决方案11】:

                对于当年的开始日期:

                SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
                

                对于当年的结束日期:

                SELECT DATEADD(DD,-1,DATEADD(YY,DATEDIFF(YY,0,GETDATE())+1,0))
                

                【讨论】:

                  【解决方案12】:

                  试试这个:

                  DATE_FORMAT(NOW(),'01/01/%Y')
                  DATE_FORMAT(NOW(),'31/12/%Y')
                  

                  【讨论】:

                  • 微软 SQL 服务器。 Msg 195, Level 15, State 10, Line 1 'NOW' is not a recognized function name.
                  • 这个答案使用 MySQL 函数(并将日期转换为字符串,这是我最讨厌的问题之一)。
                  【解决方案13】:
                  SELECT DATEADD(DD,-DATEPART(DY,GETDATE())+1,GETDATE())
                  

                  【讨论】:

                    【解决方案14】:

                    简单地写:-

                    select convert (date,DATEADD(YEAR,DATEDIFF(YEAR,0,GETDATE()),0))
                    

                    一年的开始日期。

                    select convert (date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 1, -1))  
                    

                    【讨论】:

                      【解决方案15】:
                      select to_date(substr(sysdate,1, 4) || '01/01'), to_date(substr(sysdate,1, 4) || '12/31') 
                      from dual
                      

                      【讨论】:

                      • 这是针对 PL-SQL 的,帖子说 SQL Server 2000,所以你必须使用 T-SQL。 T-SQL 中不存在 To_Date 和 Sysdate
                      【解决方案16】:

                      ---Lalmuni 演示---

                      create table Users
                      (
                      userid int,date_of_birth date
                      )
                      

                      ---插入值---

                      insert into Users values(4,'9/10/1991')
                      
                      select DATEDIFF(year,date_of_birth, getdate()) - (CASE WHEN (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()),date_of_birth)) > getdate() THEN 1 ELSE 0 END) as Years, 
                      MONTH(getdate() - (DATEADD(year, DATEDIFF(year, date_of_birth, getdate()), date_of_birth))) - 1 as Months, 
                      DAY(getdate() - (DATEADD(year, DATEDIFF(year,date_of_birth, getdate()), date_of_birth))) - 1 as Days,
                      from users
                      

                      【讨论】:

                        【解决方案17】:

                        每年都有 1 st 作为第一个日期,31 作为最后一个日期,您只需将年份附加到该日期和月份,例如:-

                         SELECT '01/01/'+cast(year(getdate()) as varchar(4)) as [First Day],
                         '12/31/'+cast(year(getdate()) as varchar(4)) as [Last Day]
                        

                        【讨论】:

                        • 这不一定是真的,因为falsehoods programmers believe about time很多。
                        • 谁能举例说明什么时候这不起作用?
                        • @slayernoah 根据服务器的本地化设置,我认为这有时会产生错误。
                        • 在 SQL Server 上使用它可能不安全,具体取决于区域设置。一个安全的版本是使用 ISO 格式的日期,无论设置如何,它总是能被正确识别。这种日期格式是 yyyy-MM-dd。最重要的是,上面返回字符串,而不是真实日期。进行这种操作的最简单方法是 datefromparts(year(getdate()), 1, 1) 和 datefromparts(year(getdate()), 12, 31)。
                        【解决方案18】:

                        看看这个:

                        select convert(varchar(12),(DateAdd(month,(Month(getdate())-1) * -1, DateAdd(Day,(Day(getdate())-1) * -1,getdate()))),103) as StartYear,
                               convert(varchar(12),DateAdd(month,12 - Month(getdate()), DateAdd(Day,(31 - Day(getdate())),getdate())),103) as EndYear
                        

                        【讨论】:

                          【解决方案19】:

                          你可以使用DATEPART函数获取当前年份,从使用getUTCDate()获取的当前日期开始

                          SELECT 
                              '01/01/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate())), 
                              '31/12/' + CONVERT(VARCHAR(4), DATEPART(yy, getUTCDate()))
                          

                          【讨论】:

                          • 这会输出字符串,而不是日期。如果那是您真正需要的,是的,但是如果您可以使用其中任何一个,请将日期保留为日期,并且不要将它们用作字符串。
                          • 我不同意,OP 没有指定,并且在 sql server 中设置的数据格式可能会返回类似 '2012-01-01 12:13:14' 而不是 '01/01/2012' 的内容跨度>
                          • @RandyMorris,同意,OP 询问他是否可以获得DATETIME 而不是字符串,显然这可能与问题的预期输出不匹配。
                          • 为什么要使用 ambiguous 日期格式(并且答案中的字符串与评论中的格式不匹配)? yyyyMMdd 是明确的。
                          • @Damien_The_Unbeliever,响应中的查询是根据问题匹配预期的输出。关于 DATETIME 的评论是对 OP 关于获取日期而不是字符串的评论的回应。答案没有反映这个讨论。
                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2021-12-07
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-05-29
                          • 1970-01-01
                          相关资源
                          最近更新 更多