Sql server 如何在列中自动添加日期,SQL Server 2014

Sql server 如何在列中自动添加日期,SQL Server 2014,sql-server,Sql Server,我对SQL Server非常陌生,我希望在一列中包含从今天开始到比今天提前30天的日期,哪种方式被认为是最有效和“正确”的方式?(我不是要密码) 我读到在SQL Server中最好避免循环,对吗?此外,我还考虑过使用登录触发器来解决日期问题(每次登录都比今天提前30天),有人知道更有效和“正确”的方法吗 感谢您获得今天的日期+30天。请执行以下操作: select dateadd(dd,30,getdate()) 要获得今天的日期+30天,请执行以下操作: select dateadd(dd,

我对SQL Server非常陌生,我希望在一列中包含从今天开始到比今天提前30天的日期,哪种方式被认为是最有效和“正确”的方式?(我不是要密码)

我读到在SQL Server中最好避免循环,对吗?此外,我还考虑过使用登录触发器来解决日期问题(每次登录都比今天提前30天),有人知道更有效和“正确”的方法吗


感谢您获得今天的日期+30天。请执行以下操作:

select dateadd(dd,30,getdate())

要获得今天的日期+30天,请执行以下操作:

select dateadd(dd,30,getdate())

要获得今天的日期+30天,请执行以下操作:

select dateadd(dd,30,getdate())

要获得今天的日期+30天,请执行以下操作:

select dateadd(dd,30,getdate())

最有效的方法是工作。SQLServer代理提供了在您选择的任何时间间隔上运行任何脚本的能力。一个非常简单的方法是创建一个每晚运行的作业,并在[今天+30天]内插入一行。

最有效的方法是创建一个作业。SQLServer代理提供了在您选择的任何时间间隔上运行任何脚本的能力。一个非常简单的方法是创建一个每晚运行的作业,并在[今天+30天]内插入一行。

最有效的方法是创建一个作业。SQLServer代理提供了在您选择的任何时间间隔上运行任何脚本的能力。一个非常简单的方法是创建一个每晚运行的作业,并在[今天+30天]内插入一行。

最有效的方法是创建一个作业。SQLServer代理提供了在您选择的任何时间间隔上运行任何脚本的能力。一个非常简单的方法是创建一个每晚运行的作业,并为[今天+30天]插入一行。

我相信您正在从一个查询中查找30行,每行表示从今天开始到今天后30天结束的日期

例如,有许多不使用游标/循环的潜在解决方案

select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
          number
          , cast(getdate() as date) as today
        FROM master.dbo.spt_values as sv
        WHERE  sv.type = 'P'
                AND sv.number BETWEEN 0 and 29
       ) nums

请注意,查询使用的是master.dbo.spt_值,有些人不喜欢使用这个()。因此,您可以使用一个小型的
union all
cross join
来生成行,也可以使用递归的“公共表表达式”(common table expression,CTE)作为替代方法

;WITH
Digits AS (
          SELECT 0 AS digit UNION ALL 
          SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
          SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
          )
, Tally AS (
          SELECT [tens].digit * 10 + [ones].digit AS number
          FROM Digits [ones]
          CROSS JOIN Digits [tens]
          )
select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
            number
          , cast(getdate() as date) as today
        FROM tally
        WHERE number BETWEEN 0 and 29
       ) nums

我相信您正在从一个查询中寻找30行,每行表示从今天开始到今天后30天结束的日期

例如,有许多不使用游标/循环的潜在解决方案

select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
          number
          , cast(getdate() as date) as today
        FROM master.dbo.spt_values as sv
        WHERE  sv.type = 'P'
                AND sv.number BETWEEN 0 and 29
       ) nums

请注意,查询使用的是master.dbo.spt_值,有些人不喜欢使用这个()。因此,您可以使用一个小型的
union all
cross join
来生成行,也可以使用递归的“公共表表达式”(common table expression,CTE)作为替代方法

;WITH
Digits AS (
          SELECT 0 AS digit UNION ALL 
          SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
          SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
          )
, Tally AS (
          SELECT [tens].digit * 10 + [ones].digit AS number
          FROM Digits [ones]
          CROSS JOIN Digits [tens]
          )
select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
            number
          , cast(getdate() as date) as today
        FROM tally
        WHERE number BETWEEN 0 and 29
       ) nums

我相信您正在从一个查询中寻找30行,每行表示从今天开始到今天后30天结束的日期

例如,有许多不使用游标/循环的潜在解决方案

select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
          number
          , cast(getdate() as date) as today
        FROM master.dbo.spt_values as sv
        WHERE  sv.type = 'P'
                AND sv.number BETWEEN 0 and 29
       ) nums

请注意,查询使用的是master.dbo.spt_值,有些人不喜欢使用这个()。因此,您可以使用一个小型的
union all
cross join
来生成行,也可以使用递归的“公共表表达式”(common table expression,CTE)作为替代方法

;WITH
Digits AS (
          SELECT 0 AS digit UNION ALL 
          SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
          SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
          )
, Tally AS (
          SELECT [tens].digit * 10 + [ones].digit AS number
          FROM Digits [ones]
          CROSS JOIN Digits [tens]
          )
select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
            number
          , cast(getdate() as date) as today
        FROM tally
        WHERE number BETWEEN 0 and 29
       ) nums

我相信您正在从一个查询中寻找30行,每行表示从今天开始到今天后30天结束的日期

例如,有许多不使用游标/循环的潜在解决方案

select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
          number
          , cast(getdate() as date) as today
        FROM master.dbo.spt_values as sv
        WHERE  sv.type = 'P'
                AND sv.number BETWEEN 0 and 29
       ) nums

请注意,查询使用的是master.dbo.spt_值,有些人不喜欢使用这个()。因此,您可以使用一个小型的
union all
cross join
来生成行,也可以使用递归的“公共表表达式”(common table expression,CTE)作为替代方法

;WITH
Digits AS (
          SELECT 0 AS digit UNION ALL 
          SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL
          SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
          )
, Tally AS (
          SELECT [tens].digit * 10 + [ones].digit AS number
          FROM Digits [ones]
          CROSS JOIN Digits [tens]
          )
select
    dateadd(day,nums.number,nums.today) as a_date
from (
        select
            number
          , cast(getdate() as date) as today
        FROM tally
        WHERE number BETWEEN 0 and 29
       ) nums

您可以使用递归CTE获取接下来30天的连续日期

CREATE TABLE Dates
(
 allDates DATE
) 

;WITH MyCTE
 AS (SELECT getdate()                   AS ddate,
            dateadd(day, 30, getdate()) AS lastDate
     UNION ALL
     SELECT dateadd(day, 1, ddate),
            lastDate
     FROM   MyCTE
     WHERE  dateadd(day, 1, ddate) <= lastDate)

INSERT INTO Dates(allDates)
SELECT ddate FROM MyCTE

SELECT * FROM Dates 
创建表日期
(
所有日期
) 
;用MyCTE
作为(选择getdate()作为ddate,
dateadd(day,30,getdate())作为lastDate
联合所有
选择日期添加(日期,1,日期),
最后日期
来自MyCTE

其中dateadd(day,1,ddate)可以使用递归CTE获取接下来30天的连续日期

CREATE TABLE Dates
(
 allDates DATE
) 

;WITH MyCTE
 AS (SELECT getdate()                   AS ddate,
            dateadd(day, 30, getdate()) AS lastDate
     UNION ALL
     SELECT dateadd(day, 1, ddate),
            lastDate
     FROM   MyCTE
     WHERE  dateadd(day, 1, ddate) <= lastDate)

INSERT INTO Dates(allDates)
SELECT ddate FROM MyCTE

SELECT * FROM Dates 
创建表日期
(
所有日期
) 
;与MyCTE
作为(选择getdate()作为ddate,
dateadd(day,30,getdate())作为lastDate
联合所有
选择日期添加(日期,1,日期),
最后日期
来自MyCTE

其中dateadd(day,1,ddate)可以使用递归CTE获取接下来30天的连续日期

CREATE TABLE Dates
(
 allDates DATE
) 

;WITH MyCTE
 AS (SELECT getdate()                   AS ddate,
            dateadd(day, 30, getdate()) AS lastDate
     UNION ALL
     SELECT dateadd(day, 1, ddate),
            lastDate
     FROM   MyCTE
     WHERE  dateadd(day, 1, ddate) <= lastDate)

INSERT INTO Dates(allDates)
SELECT ddate FROM MyCTE

SELECT * FROM Dates 
创建表日期
(
所有日期
) 
;与MyCTE
作为(选择getdate()作为ddate,
dateadd(day,30,getdate())作为lastDate
联合所有
选择日期添加(日期,1,日期),
最后日期
来自MyCTE

其中dateadd(day,1,ddate)可以使用递归CTE获取接下来30天的连续日期

CREATE TABLE Dates
(
 allDates DATE
) 

;WITH MyCTE
 AS (SELECT getdate()                   AS ddate,
            dateadd(day, 30, getdate()) AS lastDate
     UNION ALL
     SELECT dateadd(day, 1, ddate),
            lastDate
     FROM   MyCTE
     WHERE  dateadd(day, 1, ddate) <= lastDate)

INSERT INTO Dates(allDates)
SELECT ddate FROM MyCTE

SELECT * FROM Dates 
创建表日期
(
所有日期
) 
;与MyCTE
作为(选择getdate()作为ddate,
dateadd(day,30,getdate())作为lastDate
联合所有
选择日期添加(日期,1,日期),
最后日期
来自MyCTE

dateadd(day,1,ddate)在哪里可以提供更多的上下文?为什么要添加30天?为什么要在登录时添加?您的应用程序做什么?这是为了确保我们没有处理好一个问题。我想创建一个简单的报告解决方案,它将通过外接程序按钮直接链接到excel,它将是一个简单的“待办事项列表”或者类似的东西,然后我需要有一个带有日期的连续列,但您真的需要表中一组一致的“未来30天”行吗?这里的具体要求是什么。如果在表中插入一个新任务/日期时,您每天还插入额外的空行,可以吗