2013-07-01 51 views
1

在SQL Server 2008,我想设置每个星期五的默认日期值的列中显示当我插入一个新的记录?日期值?

ALTER TABLE myTable ADD CONSTRAINT_NAME DEFAULT GETDATE() FOR myColumn 

什么是每个星期五最好的展示方式?

我想要的默认值是基于现在日期,那么知道下一个可用的日期是05-07/2013

我有以下几点:

dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate()) 

但经过今天的日期的时候,它给了我:2013-06-28这实际上是最后一个星期五!它应该是和未来的星期五!

+0

所以你希望某列的默认值是最近即将到来的星期五? –

+3

HTTP://计算器。com/questions/5998084/get-the-most-recent-fridays-date -sql –

+0

我希望默认值基于现在的日期,然后知道下一个可用日期是'05-07/2013' – PriceCheaperton

回答

2
SELECT DATEADD(day,-3, DATEADD(week, DATEDIFF(week, 0, current_timestamp)+1, 0)) AS LastFridayDateOfWeek 

获取当前周的最后一天(星期日),然后减去3从那得到星期五。

更换current_timestamp如果你需要一个不同的日期周五。

编辑: 我想到这一点,如果上述(本周五,所以周六它提供了一个日期)不起作用,你可以很容易地使用基准日设定像这样:

DATEADD(DAY,7 + DATEDIFF(day,'20100109',@checkDateTime)/7*7,'20100108') as FridayRefDate 

同样的事情,但没有硬编码周五/周六在它:

DATEADD(DAY,7 + DATEDIFF(day,DATEADD(wk, DATEDIFF(wk,0,@checkDateTime),5),@checkDateTime)/7*7,DATEADD(wk, DATEDIFF(wk,0,@checkDateTime), 4)) 

所以对于20100109是星期五。

SET @checkDateTime = '2012-01-14 3:34:00.000' 
SELECT DATEADD(DAY,7 + DATEDIFF(day,'20100109',@checkDateTime)/7*7,'20100108') as FridayRefDate 

返回 “2012年1月20日”

SET @checkDateTime = '2012-01-13 3:34:00.000'返回 “2012年1月13日”

+0

这很美... –

1

如果您当前的查询让你最后周五,最容易做的事情很简单,就是加7:

select dateadd(d, 7-((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate()) 
------------------^ 
0

SELECT CONVERT(DATE(CASE WHEN DATEPART(DW,GETDATE( )) - 6- < = 0 THEN DATEADD(DD, (DATEPART(DW,GETDATE()) - 6)* -1, GETDATE()) ELSE DATEADD(DD,(DATEPART(DW,GETDATE()) ) - 1, GETDATE()) END)) AS NearestFriday

0

只要添加7公式

SELECT DATEADD(dd,CAST(5-GETDATE() AS int)%7,GETDATE()+7) 

要验证公式:

WITH test AS (
    SELECT GETDATE() AS d UNION ALL 
    SELECT DATEADD(dd,1,d) 
    FROM test WHERE d < GETDATE() + 30 
) 
SELECT 
d         AS [input], 
DATEADD(dd,CAST(5-d AS int)%7,d+7) AS [output] 
FROM test 

要调整公式,调整5和+7