90

SQLクエリに小さな問題があります。GETDATE関数を使用していますが、スクリプトを午後5時に実行すると、2011年12月12日午後5時から2011年12月18日午後5時までの間にレコードがプルアップされます。2011年12月12日全体のレコードをプルアップさせるにはどうすればよいですか?2011年12月18日は基本的に時間を無視します。

私のスクリプト:

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate > (GETDATE()-6)  
4

10 に答える 10

120

DateTimeSQL Server 2008以降では、をにキャストできますDate。これにより、時間要素が削除されます。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= (cast(GETDATE()-6 as date))  

SQL Server 2005以下では、次を使用できます。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= DateAdd(Day, Datediff(Day,0, GetDate() -6), 0)
于 2011-12-18T22:29:28.657 に答える
59

これが私が見つけた最も簡単なものです

-- Midnight floor of current date

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()))

DATEDIFFは、1900〜1-1の前後の整数日数を返し、Convert Datetimeは、それを午前0時にその日付に戻す必要があります。

DateDiffは整数を返すため、日数の加算または減算を使用して、適切なオフセットを取得できます。

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE()) + @dayOffset)

これは四捨五入ではなく、切り捨てられます...しかし、それが求められていることだと思います。(丸めて1を追加して切り捨てます...これも丸めではなく、天井ですが、おそらく必要なものです。実際に丸めるには、.5を追加して切り捨てます(これは機能しますか?)。

GetDate()に.5を追加でき、期待どおりに機能することがわかりました。

-- Round Current time to midnight today or midnight tomorrow

SELECT Convert(DateTime, DATEDIFF(DAY, 0, GETDATE() + .5))

私はSQLServer2008ですべての試行を行いましたが、これらの機能は2005にも当てはまると思います。

于 2012-06-20T22:29:38.963 に答える
12
--
-- SQL DATEDIFF getting midnight time parts 
--
SELECT GETDATE() AS Now, 
   Convert(DateTime, DATEDIFF(DAY, 0, GETDATE())) AS MidnightToday,
   Convert(DateTime, DATEDIFF(DAY, -1, GETDATE())) AS MidnightNextDay,
   Convert(DateTime, DATEDIFF(DAY, 1, GETDATE())) AS MidnightYesterDay
go
Now                   MidnightToday          MidnightNextDay        MidnightYesterDay     
 --------------------  ---------------------  ---------------------  --------------------- 
 8/27/2014 4:30:22 PM  8/27/2014 12:00:00 AM  8/28/2014 12:00:00 AM  8/26/2014 12:00:00 AM 
于 2014-08-27T23:33:13.003 に答える
5
SELECT getdate()

結果:2012-12-14 16:03:33.360

SELECT convert(datetime,convert(bigint, getdate()))

結果2012-12-1500:00:00.000

于 2012-12-18T01:51:23.307 に答える
5

日時を日付に変換してから、日時に戻すことができます。これにより、タイムスタンプがリセットされます。

getdate()を選択--2020-05-05 13:53:35.863

select cast(cast(GETDATE()as date)as datetime)--2020-05-05 00:00:00.000
于 2020-05-05T17:54:21.667 に答える
3

@BassamMehanniが述べたように、SQLServer2008以降ではDATEとしてキャストできます...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= CAST(GetDate() - 6 AS DATE)
  AND dateField <  CAST(GetDate() + 1 AS DATE)

2番目の条件は実際にはちょうどですが、dateFieldをDATEにもキャストする必要がないようにするためGetDate()の例としてこの形式を示しているため、パフォーマンスが大幅に向上します。Less Than DateX


2005年以下の場合は、これを使用できます...

SELECT
  *
FROM
  yourTable
WHERE
      dateField >= DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) - 6, 0)
  AND dateField <  DATEADD(DAY, DATEDIFF(DAY, 0, GetDate()) + 1, 0)
于 2011-12-18T22:35:21.313 に答える
3

これを使ってみてください。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >= CONVERT(DATE, GETDATE())
于 2014-05-07T09:19:06.107 に答える
1

これは安く見えるかもしれませんが、私にとってはうまくいきます

SELECT CONVERT(DATETIME、LEFT(CONVERT(VARCHAR、@ dateFieldOrVariable、101)、10)+ '00:00:00.000')

于 2017-01-18T16:41:15.847 に答える
0

私は通常します

SELECT *
FROM MyTable
WHERE CONVERT(VARCHAR, MyTable.dateField, 101) = CONVERT(VARCHAR, GETDATE(), 101)

SQL SERVER 2008を使用している場合は、次のことができます。

SELECT *
FROM MyTable
WHERE CAST(MyTable.dateField AS DATE) = CAST(GETDATE() AS DATE)

お役に立てれば

于 2011-12-18T22:28:28.783 に答える
0

時間を切り捨てることができます。

以下を使用ROUNDすると、深夜に切り捨てられます。

WHERE Orders.OrderStatus = 'Shipped'  
AND Orders.ShipDate >  CONVERT(datetime, (ROUND(convert(float, getdate()-6.5),0)))
于 2019-07-30T11:00:54.253 に答える