我想在SQL中从yyyy-mm-dd到yyyy-mm-dd获取日期。
示例:我有两个参数@startdate : 2015-12-28
和@enddate : 2016-01-02
,SQLServer中的数据库,数据类型是varchar(10)
DATE_ORDER
28-12-2015
30-12-1996
29-12-2016
30-12-1997
24-12-2015
27-12-1993
03-01-2016
01-01-1992
02-01-2016
etc...
好的,现在我想从@startdate : 2015-12-28
和@enddate : 2016-01-02
获取数据。我使用SELECT * FROM TABLE_X WHERE DATE_ORDER >= @startdate AND DATE_ORDER <= @enddate
。但结果并不是我的预期。以下是我想要的结果
28-12-2015
30-12-1996
29-12-2016
30-12-1997
01-01-1992
02-01-2016
我认为要解决这个问题,我需要做两件事:
首先,在此处@startdate
获取从@enddate
到28/12/2015, 29/12/2015, 30/12/2015, 31/12/2015, 01/01/2016, 02/01/2016
的日期范围。
第二种:在数据库中获取相同范围28/12, 29/12, 30/12, 31/12, 01/01, 02/01
的日期,忽略年份。
你能给我一些关于这个的想法吗?
答案 0 :(得分:0)
您的实际格式为“105-italian”find details here。
您可以将此行的现有VARCHAR(10)
- 值转换为实际日期时间
SELECT CONVERT(DATETIME,YourColumn,105)
接下来要知道的是,您不应该使用BETWEEN
而是使用>=StartDate AND < NakedDateOfTheFollowingDay
来检查日期范围
所以要解决你的需求从2015-12-28到2016-01-02获取日期范围你可能会这样做:
DECLARE @Start DATETIME={d'2015-12-28'};
DECLARE @End DATETIME={d'2016-01-02'};
SELECT *
FROM YourTable
WHERE CONVERT(DATETIME,YourDateColumn,105)>=@Start AND CONVERT(DATETIME,YourDateColumn,105)<@End+1
注意请注意,转换可让您的表达式不可攻击。不会使用任何索引。
答案 1 :(得分:0)
尝试此查询
SET DATEFIRST 1
DECLARE @wk int SET @wk = 2
DECLARE @yr int SET @yr = 2011
--define start and end limits
DECLARE @todate datetime, @fromdate datetime
SELECT @fromdate = dateadd (week, @wk, dateadd (YEAR, @yr-1900, 0)) - 4 -
datepart(dw, dateadd (week, @wk, dateadd (YEAR, @yr-1900, 0)) - 4) + 1
SELECT @todate = @fromdate + 6
;WITH DateSequence( Date ) AS
(
SELECT @fromdate AS Date
UNION ALL
SELECT dateadd(DAY, 1, Date)
FROM DateSequence
WHERE Date < @todate
)
--select result
SELECT * FROM DateSequence OPTION (MaxRecursion 1000)
答案 2 :(得分:0)
所以,在第二次或第三次编辑之后,它会慢慢变得清晰,你想要什么(我希望)。
所以你真的想要忽略年份的日期。
正如有人已经指出的那样,日期值在内部存储不是作为字符串,而是作为内部数据类型日期(无论内存中是什么,我都不知道)。
如果你想比较日期,你不能忽视任何部分。如果您愿意,您必须为每一行构建一个新的日期值,即给定行的日期和月份以及硬编码年份(2000或1或其他)。
SELECT * FROM TABLE_X WHERE convert(date,'2000' + substring(convert(char(8),convert(datetime, 'DATE_ORDER', 105),112),5,4),112) >= @startdate AND convert(date,'2000' + substring(convert(char(8),convert(datetime, 'DATE_ORDER', 105),112),5,4),112) <= @enddate
如果你的startdate和enddate是OVER sylvester,你必须做2个查询,从startdate到1231,一个从0101到enddate。