我想知道要使用的特定日期时间变量。代码看起来像这样:
Declare @Year = int
Declare @JanDate = Datetime
Set @JanDate = ???
我想将@JanDate设置为Month = 1,Day = 25,Year = @Year。不知道该放什么?
答案 0 :(得分:1)
对于使用SQL Server 2012的用户,请使用DATEFROMPARTS,DATETIMEFROMPARTS,DATETIME2FROMPARTS或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