(今天)和30天前的MS SQL查询

时间:2015-05-27 01:46:41

标签: sql-server-2008 date

Microsoft SQL 2008(使用Visual Studio 2010构建和测试查询)。

查询功能:此查询将通过Windows任务计划程序中的批处理文件运行。目标是每个月都能创建一个CSV文件。

我的查询:

SELECT     TYPE, DATEX, TIME, STREET, CROSS_ST, XCOORD, YCOORD
FROM       INCIDENT
WHERE      (TYPE = '644') OR
           (TYPE = '459') OR
           (TYPE = 'HS') OR
           (TYPE = '484') OR
           (TYPE = '487') OR
           (TYPE = '488') OR
           (TYPE = '10851') OR
           (TYPE = '187') OR
           (TYPE = '211') OR
           (TYPE = '245') OR
           (TYPE = '451')
ORDER BY DATEX

我正在尝试排序' DATEX'在今天的日期'之间的列(以日期时间格式)和' 30天前'

我已经尝试了所有这些陈述,但没有一个能够奏效:

(DATEX < DATEADD(month, - 1, GETDATE()))

DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), 
(
CONVERT(varchar, DATEX, 110) AS DATE,
    DATEX CONVERT(varchar, DATEADD(d,-30,GETDATE()), 23)     
    )

* ERROR INTERVAL无法识别

AND DATEX BETWEEN DATEADD(mm,-1,GETDATE()) AND DATEADD(mm,1,GETDATE()) 

*错误无法识别的语法1

=DateAdd("d", -7, Today())     *Today is not a recognized function
where date_col > DATEADD(day,-7,SYSDATETIME())

*无法识别的语法在&#39; Where&#39;

附近
where DATEDIFF(day,date_col,SYSDATETIME()) < 7

*错误附近&#39; WHERE&#39;

 DATEX Dte <  DATEADD(month, -2, GETDATE()) 

*指定非布尔类型的表达式

AND (DATEX BETWEEN ({ fn CURDATE() }, 30) AND { fn CURDATE() })

*&#39;,&#39;

附近的语法不正确

Microsoft SQL查询对表格排序的正确语法是什么?事件&#39;在&#39;今天的日期&#39> &#39; 30天前&#39;

请注意,仅使用Between 'YYYY-MM-DD' and 'YYYY-MM-DD'无效,因为我需要手动更改日期才能运行查询。我希望每个月自动创建一个CSV文件。

4 个答案:

答案 0 :(得分:1)

您可以使用Dateadd功能同时删除多个OR条件并使用IN子句

SELECT     TYPE, DATEX, TIME, STREET, CROSS_ST, XCOORD, YCOORD
FROM       INCIDENT
WHERE      DATEX BETWEEN DATEADD(dd,-30,GETDATE()) AND GETDATE() 
AND        TYPE in ('644','459','HS','484','487','488','10851','187','211','245','451')
ORDER BY DATEX

答案 1 :(得分:1)

我强烈建议阅读供应商的文档,而不是把所有东西扔在墙上,看看有什么东西。 Microsoft SQL Server具有非常全面和可读的文档,即使在RDBMS中也是如此,无论是在Web上还是安装了精彩的SQL Server Books Online

关于您的问题,您需要使用DATEADD()。但是,问题是日期时间字段和GETDATE()有一个时间组件,您需要考虑到这一点。

因此,您需要知道的一个关键是如何从日期时间中消除时间。如果您使用的是SQL Server 2008 R2及更高版本,则可以执行以下操作:

CAST(GETDATE() AS DATE)

但这不适用于SQL Server 2008及更早版本。相反,您需要使用this

DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)

如果您知道将来永远不会使用DATEX,您可以使用:

SELECT TYPE, DATEX, TIME, STREET, CROSS_ST, XCOORD, YCOORD
FROM INCIDENT
WHERE TYPE IN ('644','459','HS','484','487','488','10851','187','211','245','451')
    AND DATEX >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 30, 0) 
ORDER BY DATEX

这就是“DATEX在30天前的午夜或之后。”

现在,如果DATEX可能在将来,但它总是具有零时间值,您可以使用此:

SELECT TYPE, DATEX, TIME, STREET, CROSS_ST, XCOORD, YCOORD
FROM INCIDENT
WHERE TYPE IN ('644','459','HS','484','487','488','10851','187','211','245','451')
    AND DATEX BETWEEN DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 30, 0) AND GETDATE()
ORDER BY DATEX

这就是“DATEX在30天前或之后或之前或之后的午夜或之后。”另一方面,如果DATEX可能在将来并且将具有非零时间组件,则应使用此:

SELECT TYPE, DATEX, TIME, STREET, CROSS_ST, XCOORD, YCOORD
FROM INCIDENT
WHERE TYPE IN ('644','459','HS','484','487','488','10851','187','211','245','451')
    AND DATEX >= DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) - 30, 0) 
    AND DATEX <  DATEADD(dd, DATEDIFF(dd, 0, GETDATE()) + 1, 0)
ORDER BY DATEX

这是“DATEX在30天前或午夜午夜之前或之后。”引用“明天午夜之前”更容易,因为datetime可以有小数秒。

答案 2 :(得分:0)

您的查询应该是这样的

SELECT     TYPE, DATEX, TIME, STREET, CROSS_ST, XCOORD, YCOORD
FROM       INCIDENT
WHERE      DATEX > DATEADD(dd, -30, CAST(CAST(GETDATE() AS INT) AS DATETIME)) AND
           ((TYPE = '644') OR
            (TYPE = '459') OR
            (TYPE = 'HS') OR
            (TYPE = '484') OR
            (TYPE = '487') OR
            (TYPE = '488') OR
            (TYPE = '10851') OR
            (TYPE = '187') OR
            (TYPE = '211') OR
            (TYPE = '245') OR
            (TYPE = '451'))
ORDER BY DATEX

Here你可以找到一个有效的演示

希望这有帮助

答案 3 :(得分:0)

这应该适合你的病情。

WHERE DATEX BETWEEN GETDATE()-30 AND GETDATE()

从今天起减去30天