日期时间查询SQL SERVER

时间:2018-05-14 15:34:40

标签: sql sql-server

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

日期是24:00 Hor格式。

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

1 个答案:

答案 0 :(得分:0)

与其他人所说的一样,您需要做的第一件事就是修复您的数据;将日期存储为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之前提取今天的订单P:M'O'时钟和第二列我想在15:00之后提取订单P:M即时间从15:00 P:M到23:00 P:M在SQL SERVER中“。老实说,这是非感性的;在不同的列中根据时间放置不同的订单?我不知道你在这里是什么意思,我很害怕,而且我没有样本数据或预期结果可供使用。因此,相反,我将向您展示如何在特定日期14:00之后但在'15:00之前退货:

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

如果你需要更多细节,你会有很多评论要求你提供更多细节;我建议你看看那些。 :)