根据上个月的最后日期更新表

时间:2015-03-25 10:58:03

标签: sql sql-server-2008

请您告诉我如何创建一个列,显示每行的时间戳/日期,表示上个月的最后一天。例如:

Name    Surname     DOB        Timestamp
John    Smith      1970/04/20  2015/02/28
Cindy   Smith      1975/03/20  2015/02/28

现在这可能是5000人,而我刚给了2行来向你展示我的意思。

CREATE table employees (Name NVARCHAR(30),Surname NVARCHAR (30),DOB DATETIME,Timestamp DATETIME)

要解决日期不显示小时,分钟,秒的问题,我正在使用

CONVERT(CHAR(10),Timestamp,113)

您是否使用While循环或其他内容来创建一个列,该列显示每行的相同时间戳?

感谢。

2 个答案:

答案 0 :(得分:2)

我认为最简单的方法是从日期中减去当月的日期:

select t.*, dateadd(day, -day(timestamp), timestamp)
from table t;

编辑:在`更新:

update t
    set timestamp = dateadd(day, -day(dob), dob)

此外,您不应该使用转换来删除日期的时间组件,您只需要date。如果dob有时间成分(似乎不太可能):

update t
    set timestamp = cast(dateadd(day, -day(dob), dob) as date)

答案 1 :(得分:1)

假设该表的Timestamp列为NULL的记录。然后使用以下更新查询将更新上个月的最后一天的所有记录。

UPDATE employees 
SET [Timestamp] = CAST(DATEADD(DAY,-1,DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0))AS DATE)
WHERE [Timestamp] IS NULL

内部DATEADD将找到当月的第一天,外部DATEADD会将日期减一,从而导致上个月的最后一个日期。

GETDATE()中的月份为April时,NULL值的记录将使用31-Mar-2015进行更新。当GETDATE()变为May时,具有NULL值的记录将使用30-Apr-2015更新,即,它不会更新已具有值或已更新的记录。