【问题标题】:Setting specific dates for a variable in SQL在 SQL 中为变量设置特定日期
【发布时间】:2014-06-14 09:30:54
【问题描述】:

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

Declare @Year = int
Declare @JanDate = Datetime

Set @JanDate = ???

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

【问题讨论】:

  • 设置年份 = 2014,@year + '-01-25' 是我最好的猜测。
  • 年份是用户定义的变量。我需要 JanDate 是特定的月份和日期,但使用用户输入 @Year。
  • 你基本上只是解析出年份,然后插入你的变量+你想要使用的任何特定月份和日期

标签: sql tsql datetime sql-server-2005


【解决方案1】:

对于使用 SQL Server 2012 的用户,请使用 DATEFROMPARTSDATETIMEFROMPARTSDATETIME2FROMPARTSSMALLDATETIMEFROMPARTS 函数之一。您使用的是 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 函数的可能更有效的方法。

【讨论】:

    【解决方案2】:

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

    如果您使用 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 Server 的基准日期 1900-01-01 开始,我们添加提供的年数(修正 1900 年 ;-)

    然后我们添加天数(同样,需要修正 1 天,因为我们正在处理的日期已经是一个月的 1 号,所以添加 25 = 26,而不是我们想要的 25)。


    这里有一些您可能会觉得有用的补充代码。任何年月日都可以提供它,它会为您解决问题。

    如果用户提供“无效”值(例如 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')));
    

    -结束传输-

    【讨论】:

    • 尽管如此,你也(隐含地)将'1900-01-01' 投射到今天 :)
    • @ypercube 是的,我知道,嘘 ;-)。说真的,我知道有人会注意到这一点。通常我使用0,但我想我会在这里更清楚一点。
    • 不,我更喜欢这个。使用 0 可能会令人困惑。
    【解决方案3】:

    根据您的 SQL 版本,您的 DECLARE 语句可能不正确。以下应该可以工作(您只需将@Year 更改为您想要的年份):

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

    【讨论】:

    • mm 是什么?是可食用的 M&M 吗?
    • @DaveJemison 至少应该使用 ISO 格式的日期:YYYY-MM-DD
    【解决方案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
    

    【讨论】:

    • 我收到错误代码“日期类型不是定义的系统类型”
    • @M.Ali 另外,当您可以通过直接转换为DATETIME 来避免任何潜在问题时,实际上不需要转换为DATE
    • @user3532047 这是因为您没有在问题中提及您的 sql server 版本,而数据类型 DATE 是在 sql server 2008 版本中引入的。此外,内联变量声明值分配是您只能在 sql server 2008 及更高版本中执行的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 2015-03-06
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多