Sql server 如何在列中自动添加日期,SQL Server 2014
我对SQL Server非常陌生,我希望在一列中包含从今天开始到比今天提前30天的日期,哪种方式被认为是最有效和“正确”的方式?(我不是要密码) 我读到在SQL Server中最好避免循环,对吗?此外,我还考虑过使用登录触发器来解决日期问题(每次登录都比今天提前30天),有人知道更有效和“正确”的方法吗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,
感谢您获得今天的日期+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天”行吗?这里的具体要求是什么。如果在表中插入一个新任务/日期时,您每天还插入额外的空行,可以吗