如何在SQL中从yyyy-mm-dd到yyyy-mm-dd获取日期?

时间:2016-09-29 10:31:38

标签: sql-server sql-server-2008 date datetime

我想在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

enter image description here

我认为要解决这个问题,我需要做两件事: 首先,在此处@startdate获取从@enddate28/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的日期,忽略年份。 你能给我一些关于这个的想法吗?

3 个答案:

答案 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。