将日期舍入到该月的第一天

时间:2015-10-19 11:28:50

标签: sql sql-server tsql date sql-server-2014

我正在使用SQL Server 2014,我正在处理其中一个列的列,列出了到达日期。

它采用以下格式:

ArrivalDate
2015-10-17 00:00:00.000
2015-12-03 00:00:00.000

我正在编写一个从上表中提取数据的查询,包括ArrivalDate列。但是,我需要转换日期,以便它们成为各自月份的第一天。

换句话说,我的查询应该输出上面的例子如下:

2015-10-01 00:00:00.000
2015-12-01 00:00:00.000

我需要这个,以便我可以在PowerPivot模型中与我的日期表建立关系。

我尝试过这种语法,但它不符合我的要求:

CONVERT(CHAR(4),[ArrivalDate], 100) + CONVERT(CHAR(4), [ArrivalDate], 120) AS [MTH2]

5 个答案:

答案 0 :(得分:11)

例如,如果它是给定月份的第15个,那么你减去14并将结果转换为日期:

SELECT ArrivalDate
     , CAST(DATEADD(DAY, -DATEPART(DAY, ArrivalDate) + 1, ArrivalDate) AS DATE) AS FirstDay
FROM (VALUES
    (CURRENT_TIMESTAMP)
) AS t(ArrivalDate)
ArrivalDate             | FirstDay
2019-05-15 09:35:12.050 | 2019-05-01

但我最喜欢的是EOMONTH,需要SQL Server 2012:

SELECT ArrivalDate
     , DATEADD(DAY, 1, EOMONTH(ArrivalDate, -1)) AS FirstDay
FROM (VALUES
    (CURRENT_TIMESTAMP)
) AS t(ArrivalDate)
ArrivalDate             | FirstDay
2019-05-15 09:35:52.657 | 2019-05-01

答案 1 :(得分:7)

使用 FORMAT 格式化您的日期。

DECLARE @date DATETIME = '2015-10-17 00:00:00.000'

SELECT FORMAT(@date, 'yyyy-MM-01 HH:mm:ss.fff')

或者如果你不想要时间:

SELECT FORMAT(@date, 'yyyy-MM-01 00:00:00.000')

LiveDemo

答案 2 :(得分:3)

从SQL Server 2012开始,您还可以使用DATEFROMPARTS

SELECT DATEFROMPARTS(YEAR(ArrivalDate), MONTH(ArrivalDate), 1)
FROM   my_table

答案 3 :(得分:1)

截止日期至本月的第一天:

DATEADD(MONTH, DATEDIFF(MONTH, 0, DateColumn), 0)

答案 4 :(得分:0)

或者只是简单地使用ROUND函数-

选择回合(TO_DATE('27 -OCT-00'),'YEAR')    DUAL的“新年”;

新年

01年1月1日