【问题标题】:How can I get the date of the first second of the year with SQL?如何使用 SQL 获取一年中第一秒的日期?
【发布时间】:2010-12-04 07:41:17
【问题描述】:

我正在 SQL Server 2005 上进行清除过程,该过程必须删除表中早于 1 年前 + 当前年份过去的所有行。

例如:如果我今天执行该程序 6-10-2009,它必须删除早于 2008-01-01 00:00 的行(包括 2007 年)和向后)。

如何获取一年中第一秒的日期?

我试过了:

select cast((DATEPART(year, getdate()) -1 )AS DATETIME);

但我得到的是1905-07-02 00:00:00.000 而不是2008-01-01 00:00(正如我错误地预期的那样)。

有人可以帮帮我吗?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    编辑:这是返回当前年份,而问题是针对上一年的。已更正代码以反映这一点。

    使用这个

    select DATEADD(yy, DATEADD(yy, DATEDIFF(yy,0,getdate()), 0), -1)
    

    或者使用你的变量:

    select DATEADD(yy, DATEADD(yy, DATEDIFF(yy,0,@YourDateTimeValue), 0), -1)
    

    【讨论】:

    【解决方案2】:

    这将起作用:

    select cast('01 jan' + CAST((DATEPART(year, getdate())-1) as varchar) AS DATETIME);
    

    (我知道这不是“最好的”解决方案,可能涉及的演员阵容比必要的多,但它确实有效,而且对于如何使用它似乎是一个务实的解决方案!) p>

    【讨论】:

    • Hmm.. 有趣的是,这个问题的另一个答案(在撰写本文时)有 8 个赞成票,而我的只有 1 个赞成票和 1 个反对票,但我的解决方案是提供正确答案。 (即,对于今天的日期(2009 年 10 月 6 日),结果是 2008-01-01 00:00:00,而 Raj 的解决方案返回 2009-01-01 00:00:00)
    • 我喜欢 SELECT CONVERT(DATETIME,CAST(YEAR(GETDATE())-1 AS VARCHAR) + '0101',112) 或 SELECT CONVERT(DATETIME,CAST(YEAR(GETDATE()))- 1 AS VARCHAR),112) 更多,因为它指定了输入格式。
    • @CraigTP:我自己投票赞成你,因为你有正确的答案。我已更改我的以反映更正
    • @Raj - 谢谢。我确实更喜欢您的解决方案使用的 DateAdd/DateDiff 方法,尽管我对显然没有运行您的原始 SQL 或检查结果的支持者感到惊讶!
    【解决方案3】:
    SELECT DATEADD(year, DATEDIFF(year, 365, GETDATE()), 0)
    

    【讨论】:

    • SELECT DATEADD(year, DATEDIFF(year, 365, GETDATE()), 0) 不适用于闰年:(
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多