SQL 服务器 SELECT 唯一日期范围
SQL Server SELECT unique date range
我使用的是 SQL 服务器 2016。我必须在 table 中插入一条记录,其中包含一个日期范围。只能有一个活动的 Flash 新闻项(标题)。 Table 有 StartDate 和 StopDate。插入记录的标准是没有重叠范围,因为在给定时间只能有一个记录处于活动状态。
对于正在插入的记录,StartDate 不能为 null,而 StopDate 可以为 Null。
SQL 它无法正常工作。如果@numRows结果为0,那我应该可以插入数据了。
--table and data script
CREATE TABLE [dbo].[FlashNewsItem](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](150) NOT NULL,
[NavigateToURL] [varchar](250) NULL,
[StartDate] [smalldatetime] NOT NULL,
[StopDate] [smalldatetime] NULL,
[UpdateEmpID] [char](7) NULL,
[UpdateDate] [smalldatetime] NULL,
CONSTRAINT [PK_FlashNewsItem] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[FlashNewsItem] ON
INSERT [dbo].[FlashNewsItem] ([ID], [Title], [NavigateToURL], [StartDate], [StopDate], [UpdateEmpID], [UpdateDate])
VALUES (2, N'Weekend Outage', N'https://example.com/sites/Outage_Impact/Report.pdf ', CAST(N'2019-10-15T00:00:00' AS SmallDateTime), CAST(N'2019-10-16T00:00:00' AS SmallDateTime), N'12345', CAST(N'2019-10-31T00:00:00' AS SmallDateTime))
INSERT [dbo].[FlashNewsItem] ([ID], [Title], [NavigateToURL], [StartDate], [StopDate], [UpdateEmpID], [UpdateDate])
VALUES (3, N'AWS Public cloud tech talk', N'https://example.com/sites/SiteAssets/index.html', CAST(N'2019-10-30T00:00:00' AS SmallDateTime), CAST(N'2019-12-02T00:00:00' AS SmallDateTime), N'12345', NULL)
SET IDENTITY_INSERT [dbo].[FlashNewsItem] OFF
--Sql:
DECLARE @StartDate VARCHAR(10), @StopDate VARCHAR(10), @numRows int;
Set @StartDate ='11/30/2019'
SEt @StopDate = '12/05/2019' --null-- '12/01/2019'
SELECT @numRows = Count(*)
FROM [dbo].[FlashNewsItem]
WHERE ((CONVERT(varchar(10), StartDate, 101) > @StartDate AND
CONVERT(varchar(10), StopDate, 101) < @StartDate) -- Starts within an already used time slot
OR
(CONVERT(varchar(10), StartDate, 101) < ISNULL(@StopDate, '2079-06-06')
AND CONVERT(varchar(10), StopDate, 101) >= ISNULL(@StopDate, '2079-06-06') )) -- Ends within an already used time slot
print @numRows
如果我没理解错的话,你想插入新数据,但新数据日期不应介于任何行日期之间。
--Sql:
DECLARE @StartDate VARCHAR(10), @StopDate VARCHAR(10), @numRows int;
Set @StartDate ='2019-11-30'
SEt @StopDate = '2019-05-12'
SELECT @numRows = Count(*)
FROM [dbo].[FlashNewsItem]
WHERE (@StartDate >= StartDate AND @StartDate <= StopDate) OR
(@StopDate >= StartDate AND @StopDate <= StopDate)
print @numRows
我使用的是 SQL 服务器 2016。我必须在 table 中插入一条记录,其中包含一个日期范围。只能有一个活动的 Flash 新闻项(标题)。 Table 有 StartDate 和 StopDate。插入记录的标准是没有重叠范围,因为在给定时间只能有一个记录处于活动状态。
对于正在插入的记录,StartDate 不能为 null,而 StopDate 可以为 Null。
SQL 它无法正常工作。如果@numRows结果为0,那我应该可以插入数据了。
--table and data script
CREATE TABLE [dbo].[FlashNewsItem](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Title] [varchar](150) NOT NULL,
[NavigateToURL] [varchar](250) NULL,
[StartDate] [smalldatetime] NOT NULL,
[StopDate] [smalldatetime] NULL,
[UpdateEmpID] [char](7) NULL,
[UpdateDate] [smalldatetime] NULL,
CONSTRAINT [PK_FlashNewsItem] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[FlashNewsItem] ON
INSERT [dbo].[FlashNewsItem] ([ID], [Title], [NavigateToURL], [StartDate], [StopDate], [UpdateEmpID], [UpdateDate])
VALUES (2, N'Weekend Outage', N'https://example.com/sites/Outage_Impact/Report.pdf ', CAST(N'2019-10-15T00:00:00' AS SmallDateTime), CAST(N'2019-10-16T00:00:00' AS SmallDateTime), N'12345', CAST(N'2019-10-31T00:00:00' AS SmallDateTime))
INSERT [dbo].[FlashNewsItem] ([ID], [Title], [NavigateToURL], [StartDate], [StopDate], [UpdateEmpID], [UpdateDate])
VALUES (3, N'AWS Public cloud tech talk', N'https://example.com/sites/SiteAssets/index.html', CAST(N'2019-10-30T00:00:00' AS SmallDateTime), CAST(N'2019-12-02T00:00:00' AS SmallDateTime), N'12345', NULL)
SET IDENTITY_INSERT [dbo].[FlashNewsItem] OFF
--Sql:
DECLARE @StartDate VARCHAR(10), @StopDate VARCHAR(10), @numRows int;
Set @StartDate ='11/30/2019'
SEt @StopDate = '12/05/2019' --null-- '12/01/2019'
SELECT @numRows = Count(*)
FROM [dbo].[FlashNewsItem]
WHERE ((CONVERT(varchar(10), StartDate, 101) > @StartDate AND
CONVERT(varchar(10), StopDate, 101) < @StartDate) -- Starts within an already used time slot
OR
(CONVERT(varchar(10), StartDate, 101) < ISNULL(@StopDate, '2079-06-06')
AND CONVERT(varchar(10), StopDate, 101) >= ISNULL(@StopDate, '2079-06-06') )) -- Ends within an already used time slot
print @numRows
如果我没理解错的话,你想插入新数据,但新数据日期不应介于任何行日期之间。
--Sql:
DECLARE @StartDate VARCHAR(10), @StopDate VARCHAR(10), @numRows int;
Set @StartDate ='2019-11-30'
SEt @StopDate = '2019-05-12'
SELECT @numRows = Count(*)
FROM [dbo].[FlashNewsItem]
WHERE (@StartDate >= StartDate AND @StartDate <= StopDate) OR
(@StopDate >= StartDate AND @StopDate <= StopDate)
print @numRows