如何从今天,周和月中选择数据?

时间:2017-02-02 10:26:56

标签: sql sql-server sql-server-2008 tsql

我有一个问题,就是我现在无法解决。

我需要获取

的数据

今天本周本月

我有一个表提醒,我想根据提示选择提醒 以下参数 1.今天 本周 3.本月

rdate ,日期格式为 dd-mm-yyyy ,存储为 nvarchar

例如

如果我执行本周查询,我应该从本周开始获取数据,即

如果是星期五,我应该从那周的星期日到星期六开始获取数据

如何获取上述数据。我在互联网上搜索了很多,但我没有得到解决方案?

这是我一直在尝试的查询

SELECT 
    * 
FROM 
    reminder 
WHERE 
    date > DATE_SUB(GETDATE(), INTERVAL 1 DAY) 
ORDER BY 
    rdate DESC;

我将nvarchar转换为日期格式。

3 个答案:

答案 0 :(得分:2)

如果您无法将列数据类型更改为日期(或日期时间),则必须将其转换为查询中的日期。

以下是获取今天,本周和本月数据的一种方法:

从今天获取记录:

SELECT * 
FROM reminder 
WHERE CONVERT(Date, [date], 105) = CAST(GETDATE() as date)
ORDER BY rdate DESC;

获取本周的记录:

SELECT * 
FROM reminder 
WHERE DATEPART(WEEK, CONVERT(Date, [date], 105)) =  DATEPART(WEEK, GETDATE())
AND DATEPART(YEAR, CONVERT(Date, [date], 105)) =  DATEPART(YEAR, GETDATE())
ORDER BY rdate DESC;

从本月获取记录:

SELECT * 
FROM reminder 
WHERE DATEPART(MONTH, CONVERT(Date, [date], 105)) =  DATEPART(MONTH, GETDATE())
AND DATEPART(YEAR, CONVERT(Date, [date], 105)) =  DATEPART(YEAR, GETDATE())
ORDER BY rdate DESC;

答案 1 :(得分:2)

如果无法将[date]列的数据类型更改为DATE,则在尝试按日期过滤时会产生巨大的性能损失。

将计算列添加到表

我们可以添加一个计算列,以正确的格式存储日期,然后将其编入索引以便快速搜索:

ALTER TABLE reminder
ADD Date_Value AS (CONVERT(DATE, '12-05-2016', 105)) PERSISTED;
-- This should yield superior performance
CREATE NONCLUSTERED INDEX IX_Date_Value ON reminder (Date_Value);

用于计算日期范围的表值函数

现在,让我们创建一个inline table-valued function来生成特定期间类型的日期范围:

CREATE FUNCTION [dbo].[tvfn_Get_Date_Range](
    @Period_Type VARCHAR(100)
)
RETURNS
TABLE
AS RETURN
(
    WITH date_range AS(
            SELECT   CAST(GETDATE() AS DATE) d
                    -- This line works correctly if your week starts on Sunday
                    ,CAST(DATEADD(WEEK, DATEDIFF(WEEK, '19050101', GETDATE()), '19050101') AS DATE) AS week_start

                    ,CAST(DATEADD(DAY, - DAY(GETDATE()) + 1, GETDATE()) AS DATE) AS month_start
                    ,CAST(DATEADD(MONTH, 1, DATEADD(DAY, - DAY(GETDATE()), GETDATE())) AS DATE) AS month_end
    )
    SELECT   d AS From_Date
            ,d AS To_Date
    FROM date_range
    WHERE @Period_Type = 'DAY'

    UNION ALL

    SELECT   week_start
            ,DATEADD(DAY, 7, week_start)
    FROM date_range
    WHERE @Period_Type = 'WEEK'

    UNION ALL

    SELECT   month_start
            ,month_end
    FROM date_range
    WHERE @Period_Type = 'MONTH'

)

在上述功能中,在星期日开始。如果您需要这个可配置,请查看SET DATEFIRST in FUNCTION的答案。

现在可以快速,简单地查询

现在,您可以使用简单查询将两者结合使用:

SET @Range VARCHAR(100) = 'WEEK'

SELECT *
FROM reminder
CROSS APPLY [dbo].[tvfn_Get_Date_Range](@Range) dr
WHERE Date_Value BETWEEN dr.Date_From AND dr.Date_To

答案 2 :(得分:0)

据我所知,SQL server内部处理日期格式为MM / dd / yyyy 通常我更喜欢在SQL表中将日期保存为字符串,因为它更容易插入和检索。 例如,假设列rdate在表提醒中定义如下:
[rdate] nvarchar NULL
然后您可以按如下方式自定义一周的select语句:
“选择R. *来自提醒R其中CAST(R.rdate为datetime)之间 '03 / 04/2011'和'03 / 11/2011'“
10天如下:
“选择R. *来自提醒R其中CAST(R.rdate为datetime)之间 '03 / 04/2011'和'03 / 14/2011'“
等等。如果这不是您想要的,请提供有关您的要求的更多详细信息。