2009-10-06 63 views
5

我正在处理SQL Server 2005上的清除过程,该过程必须删除表格中所有行的时间超过1年以前+本年度的时间。如何使用SQL获取今年第一秒的日期?

例如:如果我今天执行2009年6月10日已删除行比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(我错误预期)。

有人可以帮我吗?

回答

4

这将工作:

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

(我知道这是不是 “最好” 的解决方案,可能涉及更多的演员,而不是必要的,但它的工作原理,以及如何使用它似乎是一个问题!MATIC溶液)

+0

嗯..有趣的是,这个问题的其他答案(撰写本文时)有8个upvotes,而我的只有1个和1个投票,但我的答案是唯一的解决方案。 (即今天的日期(2009年10月6日)结果是2008-01-01 00:00:00,而Raj的解决方案返回2009-01-01 00:00:00) – CraigTP 2009-10-06 17:23:49

+1

我喜欢SELECT CONVERT(DATETIME,CAST( YEAR(GETDATE()) - 1 AS VARCHAR)+'0101',112)或SELECT CONVERT(DATETIME,CAST(YEAR(GETDATE()) - 1 AS VARCHAR),112)更多,因为它指定了输入格式。 – LukLed 2009-10-06 17:50:41

+0

@CraigTP:我自己提倡你,因为你有正确的答案。我改变了我的反映更正 – 2009-10-07 13:08:43

11

编辑:这是当年返回,当问题是去年的问题。代码已被更正以反映这一点。

使用本

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

,或使用你的变量:

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

这是SQL Server的一个相当标准的事情,每个人都应该学习的,这里是一个链接,显示如何做到这一点的年,月,日,时,分... HTTP: //stackoverflow.com/questions/85373/floor-a-date-in-sql-server – 2009-10-06 15:32:34

+0

这个答案会产生错误的结果。 – JamesM 2009-10-07 10:28:12

0
SELECT DATEADD(year, DATEDIFF(year, 365, GETDATE()), 0) 
+1

SELECT DATEADD(year,DATEDIFF(year,365,GETDATE()),0)不适用于闰年:( – 2011-08-02 07:32:25