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文件。
答案 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天