在SQL中设置变量的特定日期

时间:2014-04-28 17:46:12

标签: sql tsql datetime sql-server-2005

我想知道要使用的特定日期时间变量。代码看起来像这样:

Declare @Year = int
Declare @JanDate = Datetime

Set @JanDate = ???

我想将@JanDate设置为Month = 1,Day = 25,Year = @Year。不知道该放什么?

4 个答案:

答案 0 :(得分:1)

对于使用SQL Server 2012的用户,请使用DATEFROMPARTSDATETIMEFROMPARTSDATETIME2FROMPARTS或OR SMALLDATETIMEFROMPARTS函数之一。您使用的是SQL 2005,因此这些功能无法使用,但无论如何我都会将它们包含在内,以防2012年或更高级别的人在将来发现此问题。

例如:

declare @Year int = 2014
declare @JanDate datetime

select @JanDate = DATETIMEFROMPARTS(@Year, 1, 25, 0, 0, 0, 0)

对于海报和我们仍然使用SQL Server 2005的人,您可以将字符串连接在一起并将其转换为日期:

declare @Year int = 2014
declare @JanDate datetime

select @JanDate = CAST(CAST(@Year as varchar) + '-1-25' as varchar)

或者,请参阅this question的答案,了解使用多个DATEADD函数可能更有效的方法。

答案 1 :(得分:1)

我不喜欢将字符串转换为日期。你也不应该。

如果您使用的是SQL Server 2012或更高版本,那么您可以使用Paul Williams提出的答案,即DateFromParts或类似的功能。

对于早期版本,这里是我将使用的方法:

DECLARE @Year    int;
DECLARE @JanDate datetime;

SET @Year = 2014;

SET @JanDate = DateAdd(dd, 25 - 1, DateAdd(yy, @Year - 1900, '1900-01-01'));

SELECT @JanDate;

对某些人来说,这似乎过于复杂,但它执行动作的方式对我来说更令人愉悦,因为它只使用日期和整数。

从SQL Servers基准日期1900-01-01开始,我们添加提供的年数(校正1900年;-)

然后我们添加天数(同样,需要更正1天,因为我们正在使用的日期已经是本月的第1天所以增加25 = 26,而不是我们想要的25)。 / p>


以下是一些您可能会觉得有用的补充代码。它可以为您提供任何一年,一月和一天的服务。

如果用户提供“无效”值(例如2014-02-31 - 没有2月31日),那么该功能将不会失败,与文本到目前为止的投射不同。相反,它将提供结果2014-03-03,即2月1日之后的31天。

这种逻辑可能不会让一些人满意,但它一直对我有用。

足够的胡扯,这是代码:

DECLARE @y int
      , @m int
      , @d int;

SET @y = 2014;
SET @m = 6;
SET @d = 22;

SELECT DateAdd(dd, @d - 1, DateAdd(mm, @m - 1, DateAdd(yy, @y - 1900, '1900-01-01')));

- 传输 -

答案 2 :(得分:-2)

您的DECLARE语句可能不正确,具体取决于您的SQL版本。以下内容应该有效(您只需要将@Year更改为您想要的年份):

DECLARE @Year int 
DECLARE @JanDate Datetime 
SET @Year=2013
SET @JanDate='1/25/'+CAST(@Year AS VARCHAR)

答案 3 :(得分:-4)

Declare @Year int;
SET @Year = 2013;
Declare @JanDate  Datetime;

SET @JanDate = CAST(
                CAST(@Year AS NVARCHAR(4)) + CAST('01' AS NVARCHAR(2)) +  CAST('25' AS NVARCHAR(2))
                AS DATETIME)
SELECT @JanDate


RESULT: 2013-01-25 00:00:00.000

或者只是

Declare @Year int;
SET @Year = 2013;
Declare @JanDate  Datetime;

SET @JanDate = CAST(
                CAST(@Year AS NVARCHAR(4)) + '01' +  '25'
                AS DATETIME)
SELECT @JanDate 

RESULT: 2013-01-25 00:00:00.000