【问题标题】:Creating date ranges from time stamp从时间戳创建日期范围
【发布时间】:2014-07-08 03:36:00
【问题描述】:

下面的查询从Time_Stamp 列中获取最大日期作为来自Survey 的StartDate。为 EndDate 添加 90 天。然后通过在原始 EndDate 上添加更多,再创建 2 个间隔为 90 天的范围。

我试图让 StartDate 落在 Jan1st、April1st、July1st 或 Oct1 的 4 个桶内。如果 Max Time_Stamp 早于这些日期中的 1 个,那么这将是我的范围的第一个 StartDate ...因此对于下面的示例,最大 Time_Stamp 是 June4th,因此 StartDate 需要是 7 月 1 日。这在 sql server 中可行吗?

医院 1 的时间戳

Time_Stamp
-----------
2014-06-04 16:01:14.000
2014-06-04 15:55:33.000
2014-06-04 15:45:05.000
2014-06-04 15:36:15.000
2014-06-04 15:00:34.000
2014-06-04 14:35:24.000
2014-06-04 14:04:50.000
2014-06-04 13:46:55.000
2014-06-04 13:23:57.000
2014-06-04 11:27:51.000

当前输出:

StartDate   EndDate
----------- -----------
Jun  4 2014 Sep  2 2014
Sep  3 2014 Dec  2 2014
Dec  3 2014 Mar  3 2015

查询

WITH Start AS
(
    SELECT 
           MAX(Time_Stamp) as StartDate, 
           DATEADD(day, 90, MAX(Time_Stamp)) as EndDate
    FROM Survey
    WHERE MainHospital = 'Hospital1'

),
Results AS
(
   SELECT StartDate, EndDate from Start
   UNION
   SELECT DATEADD(DAY, 1, EndDate), DATEADD(day, 91, EndDate) FROM Start
   UNION
   SELECT DATEADD(DAY, 92, EndDate), DATEADD(day, 182, EndDate) FROM Start
)
SELECT LEFT(StartDate,11) AS StartDate, LEFT(EndDate,11) AS EndDate FROM Results

只是一个更新,这为我提供了第一个 StartDate 所需的内容...

    --Return first day of next quarter
SELECT DATEADD(qq, DATEDIFF(qq, 0, MAX(Time_Stamp)) + 1, 0)
FROM Survey
WHERE MainHospital = 'Hospital1'

【问题讨论】:

  • 可能包括类似DATENAME(Quarter, CAST(CONVERT(VARCHAR(8), Time_Stamp) AS DATETIME))

标签: sql-server


【解决方案1】:
DECLARE @Year DATE = '2013-01-01'
DECLARE @Quarter INT = 1;

SELECT  DATEADD(QUARTER, @Quarter - 1, @Year) ,
        DATEADD(DAY, -1, DATEADD(QUARTER,  @Quarter, @Year))

您可以使用 DATEPART(QUARTER, @Date) 来确定选择记录的季度,然后您可以使用此查询来查找该季度的开始/结束日期。

像这样使用它:

SELECT  DATEADD(QUARTER, DATEPART(QUARTER, Time_Stamp) - 2, DATEADD(YEAR, DATEDIFF(YEAR, 0, Time_Stamp), 0)) AS StartDate,
        DATEADD(SECOND, -1, DATEADD(QUARTER,  DATEPART(QUARTER, Time_Stamp) - 1, DATEADD(YEAR, DATEDIFF(YEAR, 0, Time_Stamp), 0))) AS EndDate
FROM Hospital1

【讨论】:

  • 这看起来很有用,但不知道如何合并到我的查询和我的列 Time_Stamp
【解决方案2】:

您似乎只是想计算约会的四分之一,对吗?

如果是这样,您可以使用:

SELECT DATENAME(Quarter, CAST(CONVERT(VARCHAR(8), GETDATE()) AS DATETIME)) as Quarter

【讨论】:

  • 是的!刚刚发现,不知道如何将它包含在我的查询中,因为我正在创建 90 天的间隔。
  • 那么您是否也在寻找该季度的开始和结束日期?
  • 是的,选择 Time_Stamp 的 TOP 1 MAX,确定哪个季度是该日期的下一个季度(不是当前季度),并将其作为我的查询中的第一个 StartDate,我在其中添加天数以获得间隔。
【解决方案3】:

计算一个季度的日期范围:

select DATEADD(qq, datediff(qq, 0, getdate()),0) as first

select dateadd(dd, -1, DATEADD(qq, datediff(qq, 0, getdate()) +1, 0)) as last

【讨论】:

    猜你喜欢
    • 2015-09-17
    • 2014-02-11
    • 2011-11-16
    • 2011-04-27
    • 2019-06-12
    • 1970-01-01
    • 2023-01-10
    • 2020-10-05
    • 2022-01-15
    相关资源
    最近更新 更多