25

DATEFROMPARTS(year, month, day)SQL Server 2008 中有类似的东西吗?我想使用当前的年份和月份创建日期,但我自己的月份日期。这需要在一行中完成,以便在计算列公式中使用。

例如(我不确定它是否有效,因为我没有 SQL Server 2012):

DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 3)

有没有办法在 SQL Server 2008 中做到这一点?

DATEFROMPARTS 似乎仅在 SQL Server 2012 中可用(链接)

4

4 回答 4

26

你可以使用这样的东西来制作你自己的日期时间:

DECLARE @year INT = 2012
DECLARE @month INT = 12
DECLARE @day INT = 25

SELECT CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day)
 AS DATETIME)
于 2013-10-22T16:54:23.177 回答
25

使用3来自您的示例,您可以执行以下操作:

dateadd(dd, 3 -1, dateadd(mm, datediff(mm,0, current_timestamp), 0))

它的工作原理是查找自纪元日期以来的月数,将这些月添加回纪元日期,然后将所需的天数添加到先前的结果中。Date这听起来很复杂,但它建立在将(不是 DateTime)类型添加到 Sql Server 2008之前截断日期的规范方法之上。

您可能会在这里看到其他建议构建日期字符串的答案。我敦促您避免使用字符串的建议。使用字符串可能会慢得多,并且使用替代日期排序规则/格式存在一些潜在的缺陷。

于 2013-10-22T16:54:04.343 回答
5
CREATE FUNCTION  DATEFROMPARTS
(
    @year int,
    @month int,
    @day int
)
RETURNS datetime
AS
BEGIN

     declare @d datetime

     select @d =    CAST(CONVERT(VARCHAR, @year) + '-' + CONVERT(VARCHAR, @month) + '-' + CONVERT(VARCHAR, @day) AS DATETIME)
    RETURN  @d 

END
GO
于 2014-12-11T13:20:39.763 回答
0
CREATE FUNCTION  DATEFROMPARTS
(
    @year int,
    @month int,
    @day int
)
RETURNS datetime
AS
BEGIN

    declare 
    @sy varchar(max)
    ,@sm varchar(max)
    ,@sd varchar(max)
    ;

    set @sy = convert(varchar(max),@year);
    set @sm = (case when @month<10 then '0' else '' end) + 
    convert(varchar(max),@month);
    set @sd = (case when @day<10 then '0' else '' end) + 
    convert(varchar(max),@day);

    RETURN  convert(datetime, @sy + '-' + @sm + '-' + @sd + 'T00:00:00.000');
END
于 2021-12-11T22:04:07.650 回答