【问题标题】:Creating date in SQL Server 2008在 SQL Server 2008 中创建日期
【发布时间】:2013-10-31 16:03:05
【问题描述】:

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

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

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

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

DATEFROMPARTS 似乎仅适用于 SQL Server 2012 (link)

【问题讨论】:

  • Create a date with T-SQL的可能重复
  • 我看到了那个答案,可以在计算列公式中使用吗?
  • @Jaiesh_bhai - 持久化或非持久化计算列?
  • @MartinSmith 非持久化

标签: sql sql-server sql-server-2008 date calculated-columns


【解决方案1】:

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

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)

【讨论】:

  • 将年份转换为 CHAR(4) 并将月份和日期转换为 CHAR(2) 可能不太容易出错。在您的示例中,您对它们进行了硬编码,但在正常使用中,它们可能来自其他地方,如果这些参数不是预期的长度,则可能会导致问题。
【解决方案2】:

使用您示例中的3,您可以这样做:

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

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

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

【讨论】:

  • @MartinSmith 谢谢,已修复:o 暂时忘记了我会将天数添加到 1 而不是 0。
  • 某处似乎存在语法错误,在进行编辑后我没有看到语法错误。 Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'dd'.
  • @Jaiesh_bhai 我也一度错过了右括号。如果我将 select 放在现在存在的前面并将其直接粘贴到 Management Studio 的查询窗口中,如果我现在运行它,我会得到 2013-10-03 00:00:00.000
  • 哦,好吧!谢谢那是我的愚蠢。我忘记了SELECT。这正是我正在寻找的。​​span>
【解决方案3】:
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

【讨论】:

  • 今天在一个旧版本的 sql 上遇到了这个问题,这就像一个冠军!
【解决方案4】:
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

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多