代码之家  ›  专栏  ›  技术社区  ›  LordBoBCUP

UNIX字符串的SQL日期格式,然后选择

  •  1
  • LordBoBCUP  · 技术社区  · 6 年前

    我正在尝试查询一个SQL数据库,该数据库以UNIX格式ddd MM d或ddd MM dd将日期存储为字符串。我在将这些数据转换为任何类型的SQL日期格式时遇到问题,因此我可以在日期字段上使用Like进行查询,以便找到与请求日期最接近的日期。

    为了概述我正在做的事情,我有一个aspx页面,上面有两个日期选择器。用户选择一个开始和结束日期,该日期转换为与数据库中使用的格式相同的格式(ddd MM d或ddd MM dd),然后使用最小/最大选择来查找所提供日期的最低匹配ID和最高匹配ID。如果传入的日期有记录的话,这样做很好。但是,我想将存储在数据库中的日期转换为一种格式,在这种格式中,我可以选择传入日期之后的第一个日期,以及结束传入日期之前的最后一个日期,以便返回中间的所有行。为了实现这一点,我需要将日期转换为可以在SQL中使用的格式,而不仅仅是现在存储的nvarchar。

    你有什么建议(除了显而易见的,将日期作为我无法控制的正确日期存储在首位)作为实现我追求的目标的最简单方法

    |  ID  |  Date         | Notes                 | 
    | 1000 |Fri Mar  2     | Something Interesting |
    | 1001 |Mon Mar  5     | Something Good        |
    | 1002 |Fri Mar  9     | Something Good        |
    | 1003 |Mon Mar 12     | Something Interesting |
    

    我将于3月4日星期日作为开始日期,3月9日星期五作为结束日期。然而,我想得到这两天之间的所有记录。目前我的代码是:

    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[GetReport] 
        @StartDate nvarchar(50), 
        @EndDate nvarchar(50)
    AS
    BEGIN
        SET NOCOUNT ON;
        DECLARE @startID int
        DECLARE @endID int
    
        SELECT @StartID = MIN(ID)  FROM [HistoricalStatus]
        WHERE timeconnected LIKE @StartDate + '%'
    
        SELECT @endID = MAX(ID) FROM HistoricalStatus
        WHERE timeconnected LIKE @EndDate + '%'
    
        SELECT TOP 1000 *
          FROM [HistoricalStatus]
          WHERE ID BETWEEN @startID AND @endID
          ORDER BY id ASC
    END
    

    但是,正如您所看到的,这只适用于传入的、在数据库中实际有值的日期。我想找到一种方法来选择传入日期之间的所有内容,无论它们是否首先存在。我唯一的猜测是,我必须将日期列转换为正确的日期格式,然后我可以使用LIKE操作符来获得最接近所请求日期的日期?

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Cappelletti    6 年前

    如果我理解你的问题,你想把字符串转换成日期,

    以下假设为本年度

    实例

    Declare @YourTable Table ([ID] varchar(50),[Date] varchar(50),[Notes] varchar(50))
    Insert Into @YourTable Values 
     (1000,'Fri Mar  2','Something Interesting')
    ,(1001,'Mon Mar  5','Something Good')
    ,(1002,'Fri Mar  9','Something Good')
    ,(1003,'Mon Mar 12','Something Interesting')
    
    Select * 
          ,AsDate = try_convert(date,substring([Date],4,25)+' '+datename(year,getdate()))
     from @YourTable
    

    退货

    ID      Date        Notes                   AsDate
    1000    Fri Mar  2  Something Interesting   2018-03-02
    1001    Mon Mar  5  Something Good          2018-03-05
    1002    Fri Mar  9  Something Good          2018-03-09
    1003    Mon Mar 12  Something Interesting   2018-03-12