【问题标题】:Declare a variable which converts Date data type to Integer声明一个将 Date 数据类型转换为 Integer 的变量
【发布时间】:2021-06-03 09:31:36
【问题描述】:

在 SQL Server 中,以下代码为我提供了从今天开始的上周星期日的日期:

DECLARE @dt date = GETDATE();
SELECT dateadd(week,datediff(week,6,@dt),6);

我需要从给定的日期声明一个变量并将该变量设为整数。我试过这样的事情:

DECLARE @last_sunday INT;
SELECT dateadd(week,datediff(week,6,@dt),6) INTO @last_sunday FROM xxx;

但问题是我不明白我应该在FROM之后写哪个表。在我的解释中:

dateadd(week,datediff(week,6,@dt),6)

是某种计算,而不是从数据表中收集值。如何将上周日的日期转换为整数变量?

【问题讨论】:

  • 只是declare @last_sunday int = dateadd(...);。如果没有表,为什么要包含一个??
  • sql server 不需要FROM
  • 当您实际上并未从任何表中进行选择时,您的问题似乎出在使用 select 上。只需使用declare @last_sunday int = foo() 或单独声明然后set @last_sunday = foo()
  • SELECT...INTO 也不适用于变量。 SELECT...INTO 使用数据集的定义创建一个表,然后将该数据插入到所述新表中。你不是CREATE一个(表类型)变量,你DECLARE它。它肯定不适用于标量变量。

标签: sql sql-server variables declare


【解决方案1】:

你需要做这样的事情:

第 1 步

DECLARE @date DATE = dateadd(week,datediff(week,6,GETDATE()),6)

第 2 步

DECLARE @dateInt AS INT = REPLACE(@date, '-', '')

在第一步中,您将获得日期数据类型中的正确日期值。鉴于日期包含连字符,您将在第 2 步中使用REPLACE 函数将其删除,同时将您的日期转换为整数值。

最后,为了确保第 1 步和第 2 步有效,您可以运行以下查询:

SELECT @dateInt

今天,这将为您提供以下值:20210530

【讨论】:

  • 感谢@Michele La Ferla 给我一个完整的答案,而不是像 cmets 那样指出我错了。我知道我错了,我为什么还要问关于stackoverflow的问题? :'D 无论如何,这完全符合我的要求,非常感谢! :D
  • @chilifan cmets 不仅指出您的查询错误,他们还提供解释为什么它是错误的,并提供可行的替代方案。
  • 另请注意,此答案取决于本地设置,因为 @date 已隐式转换为字符串。并不是在每台机器上,隐式转换的值都会包含破折号。
  • 我知道 cmets 也尝试提供解决方案,但他们都为我生成了更多错误消息。我只是赞成解决我的问题的那个:)
【解决方案2】:

为了让生活更轻松,onw 还可以创建一个函数:

CREATE FUNCTION LastSunday ()
RETURNS int
AS
BEGIN
    RETURN convert(int,dateadd(week,datediff(week,6,getdate()),6))

END
GO

之后你可以这样做:

select dbo.LastSunday();

这将导致(现在是3th jun 2021):44344

【讨论】:

  • 这不是他想要的,因为日期值和整数44344之间没有字面相关性,从某种意义上说,整数在逻辑上没有意义。
  • 数字20210530和日期2021-05-30之间没有关联。第一个只是一个随机数,第二个是上周日的数据),实际上是一个随机日期....
  • 当然有相关性。显然它比44344 更有意义
【解决方案3】:

最简单的查询:

select cast(replace(cast(getdate() as date),'-','') as int) as DateToInteger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2018-04-28
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多