我正在尝试查询以UNIX格式,ddd MM d或ddd MM dd存储日期为字符串的SQL数据库。我无法将这些转换为任何类型的SQL Date格式,因此我可以使用Date字段上的Like进行查询,以便找到与请求日期最接近的日期。
为了概述我正在做什么,我有一个aspx页面,上面有2个日期选择器。用户选择开始日期和结束日期,转换为与数据库中使用的格式相同的格式(ddd MM d或ddd MM dd)然后使用MIN / MAX选择查找最低匹配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运算符来获取最接近所请求日期的日期吗?
先谢谢。
答案 0 :(得分:1)
如果我理解您的问题,那么您希望将字符串转换为日期,
以下假设当前年度
示例强>
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