日期时间查询 SQL SERVER

Posted

技术标签:

【中文标题】日期时间查询 SQL SERVER【英文标题】:Date time query SQL SERVER 【发布时间】:2018-05-14 15:34:39 【问题描述】:

我有日期列 Order_Date 日期时间格式 Isdat 14/05/2018 13:13:06 这是格式),我需要在 14:00 P:M 'O' Clock 之前提取今天的订单,在第二列中我想在 15:00 P:M 之后提取订单,即时间从 15:00 P:M 到 23:00 P:M 在 SQL SERVER 中,

日期采用 24:00 小时格式。

在输出Order_date应该是'yyyy-MM-dd hh:mm:ss'格式

【问题讨论】:

你的列是什么数据类型? 样本数据和期望的结果真的很有帮助。我不知道您是否要过滤行或添加新列或您想要做什么。我不确定“提取今天的订单”应该是什么意思。 日期类型没有格式。它们是二进制值。格式在解析文本或将日期值格式化为文本时应用。你实际上想做什么?您是否尝试将日期参数传递给查询?或者向最终用户显示结果?在这两种情况下,您不应该使用字符串 发布您使用的查询和实际的表定义。 Order_Date 是什么?字符串字段(坏主意)? datetime?还是您有单独的日期和时间字段?您不需要字符串转换,您需要使用适当的日期函数来过滤结果。例如,您可以只使用cast(order_date as time) between ...,尽管这不会使用任何索引 日期时间没有格式,所以我们仍然不知道该列是什么数据类型。 【参考方案1】:

正如其他人所说,您需要做的第一件事是修复数据;将日期存储为varchar 是一个糟糕的设计选择。始终使用代表您数据的数据类型;将日期存储为date,将数字存储为int/decimal,等等。

根据[文档],dd/MM/yyyy hh:mm:ss 没有样式代码,但是,下面的快速 SQL 告诉我样式代码 103 确实有效:

DECLARE @date varchar(50) = '31/05/2017 19:12:56';

WITH N AS (
    SELECT 1 AS i
    UNION ALL
    SELECT i + 1
    FROM N
    WHERE I + 1 <= 150)
SELECT I, TRY_CONVERT(datetime2(0),@Date,I) AS Conversion
FROM N
OPTION (MAXRECURSION 150);

所以,首先,让我们修复您的数据。所以,让我们添加新列并删除旧列。

ALTER TABLE YourTable ADD OrderDate datetime2(0);

UPDATE YourTable
SET OrderDate = CONVERT(datetime2(0),YourDateColumn,103);
GO

ALTER TABLE YourTable DROP COLUMN YourDateColumn;

EXEC sp_rename 'dbo.YourTable.OrderDate','YourDateColumn','COLUMN';

好的,现在我们已经摆脱了您糟糕的数据类型,并获得了您的新专栏。很好。

现在,你想在这里专门查询时间;如果您这样做,理想情况下您希望将时间值和日期分开。使用 WHERE CONVERT(time, YourDateColumn) BETWEEN '14:00' AND '15:00' 之类的东西会使查询不可 SARGHable。因此,让我们为此使用几个计算列:

ALTER TABLE YourTable ADD OrderDate AS CONVERT(date, YourDateColumn);
ALTER TABLE YourTable ADD OrderTime AS CONVERT(time, YourDateColumn);

现在,对于您手头的问题:“我需要在下午 14:00 之前提取今天的订单,在第二列中,我想在下午 15:00 之后提取订单,即时间SQL SERVER 中从 15:00 P:M 到 23:00 P:M"。老实说,这是荒谬的;根据时间在不同的列中放置不同的订单?恐怕我不明白你在这里的意思,而且我没有样本数据或预期的结果可以使用。因此,我将向您展示如何在 14:00 之后但在特定日期的“15:00”之前退货:

SELECT *
FROM YourTable YT
WHERE OrderDate = '20170515'
  AND OrderTime >= '14:00'
  AND OrderTime < '15:00';

如果您需要更多详细信息,很多 cmets 要求您提供更多详细信息;我建议你看看那些。 :)

【讨论】:

非常感谢您的回答 Datetime 2 和 Tryconvert 是不可识别的内置函数名称 sql server 2014。 @Bilal datetime 2tryconvert 不是没有,因为两者都拼写不正确。这是datetime2TRY_CONVERTdatetime2 在 SQL Server 2008 中引入,TRY_CONVERT 在 2012 年引入。它们都在 SQL Server 2014 中。 @Bilal 供您参考:TRY_CONVERT & datetime2。在说明某个 SQL Server 版本中不存在某些内容之前,请进行一些尽职调查。 :)

以上是关于日期时间查询 SQL SERVER的主要内容,如果未能解决你的问题,请参考以下文章

从查询 SQL Server 中的每个日期获取第一个和最后一个日期时间

sql server jdbc查询日期时间列

sqlserver获取当前日期条件查询

Sql Server函数日期时间函数日期查询今天昨天7天内30天的数据

Sql server 查询指定时间区间工作日数休息日数等日期操作

如何在SQL Server中选择特定日期的行,忽略时间。