数据表AAA,有某列A
数据有
2014-1-1
2014-1-2
2014-1-3
这时候想搜索出的结果是,不含A的,一月的日期,有什么好的方法?
是要在另一张表存放,2014-1-1到2014-1-31吗?然后进行对比?
还是有什么函数能直接搜索?
如果要在另一张表存放整个日期表,那有什么办法存,好几年的数据一次性从进去吗?比如2014-1-1,到2024-12-31的?
------解决思路----------------------
可以考虑存一个完整的时间表,10年也就3000多行,性能上完全没问题
------解决思路----------------------
这时候想搜索出的结果是,不含A的,一月的日期,有什么好的方法?
是要在另一张表存放,2014-1-1到2014-1-31吗?然后进行对比?
这个想法可以,直接表连接就出来了,效率不错
如果要在另一张表存放整个日期表,那有什么办法存,好几年的数据一次性从进去吗?比如2014-1-1,到2024-12-31的?
SELECT DATEADD(DAY,number,'2014-1-1') FROM(
SELECT number FROM master..spt_values WHERE type='P'
UNION ALL SELECT number+2049 FROM master..spt_values WHERE type='P'
)T
WHERE DATEADD(DAY,number,'2014-1-1')<='2024-12-31'
------解决思路----------------------
DECLARE @startdate DATETIME ,
@enddate DATETIME
SET @startdate = '2008-01-01'
SET @enddate = '2009-12-31'
SELECT
DISTINCT
YEAR(CONVERT(VARCHAR(10), DATEADD(day, number, @startdate), 120)) AS [year] ,
MONTH(CONVERT(VARCHAR(10), DATEADD(day, number, @startdate), 120)) AS [month]
FROM master..spt_values
WHERE DATEDIFF(day, DATEADD(day, number, @startdate), @enddate) >= 0
AND number >= 0
AND type = 'p'
------解决思路----------------------
完善一下:
DECLARE @startdate DATETIME ,
@enddate DATETIME
SET @startdate = '2008-01-01'
SET @enddate = '2008-02-01'
SELECT
DISTINCT
cast(YEAR(CONVERT(VARCHAR(10), DATEADD(day, number, @startdate), 120))as char(4))+'-'+
right('00'+cast(MONTH(CONVERT(VARCHAR(10), DATEADD(day, number, @startdate), 120))as varchar(2)),2) +'-'+
right('00'+cast(day(CONVERT(VARCHAR(10), DATEADD(day, number, @startdate), 120))as varchar(2)),2)[年月日]
FROM master..spt_values
WHERE DATEDIFF(day, DATEADD(day, number, @startdate), @enddate) >= 0
AND number >= 0
AND type = 'p'
/*
年月日
--------------
2008-01-01
2008-01-02
2008-01-03
2008-01-04
2008-01-05
2008-01-06
2008-01-07
2008-01-08
2008-01-09
2008-01-10
2008-01-11
2008-01-12
2008-01-13
2008-01-14
2008-01-15
2008-01-16
2008-01-17
2008-01-18
2008-01-19
2008-01-20
2008-01-21
2008-01-22
2008-01-23
2008-01-24
2008-01-25
2008-01-26
2008-01-27
2008-01-28
2008-01-29
2008-01-30
2008-01-31
2008-02-01
*/