我有一个问题,就是我现在无法解决。
我需要获取
的数据今天,本周和本月
我有一个表提醒,我想根据提示选择提醒 以下参数 1.今天 本周 3.本月
列 rdate ,日期格式为 dd-mm-yyyy ,存储为 nvarchar
例如
如果我执行本周查询,我应该从本周开始获取数据,即
如果是星期五,我应该从那周的星期日到星期六开始获取数据
如何获取上述数据。我在互联网上搜索了很多,但我没有得到解决方案?
这是我一直在尝试的查询
SELECT
*
FROM
reminder
WHERE
date > DATE_SUB(GETDATE(), INTERVAL 1 DAY)
ORDER BY
rdate DESC;
我将nvarchar转换为日期格式。
答案 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'“
等等。如果这不是您想要的,请提供有关您的要求的更多详细信息。