【问题标题】:SQL Server SELECT unique date rangeSQL Server SELECT 唯一日期范围
【发布时间】:2019-11-01 15:28:03
【问题描述】:

我使用的是 SQL Server 2016。我必须在表中插入一条带有日期范围的记录。只能有一个活动的 Flash 新闻项目(标题)。表有 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

【问题讨论】:

  • 我认为StartDate不能同时大和小。
  • 我不清楚你所说的同时大和小是什么意思。在表中它被定义为 smalldatetime,但由于从 UI 中 @StartDate 将作为 varchar(10) 传递,这就是我在查询中转换它的方式

标签: sql sql-server date-range


【解决方案1】:

如果我理解正确,您想插入新数据,但新数据日期不应介于任何行日期之间。

    --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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2018-02-06
    相关资源
    最近更新 更多